2011-05-01 40 views
6

? Tengo un requerimiento para extraer todo el texto que está presente en el <body> del html. Muestra de entrada HTML: -¿Cómo puedo extraer solo el texto del html

<html> 
    <title>title</title> 
    <body> 
      <h1> This is a big title.</h1> 
      How are doing you? 
      <h3> I am fine </h3> 
      <img src="abc.jpg"/> 
    </body> 
</html> 

La salida debe ser: -

This is a big title. How are doing you? I am fine 

Quiero utilizar solamente HtmlAgility para este propósito. Sin expresiones regulares por favor.

Sé cómo cargar HtmlDocument y luego usando xquery como '// body' podemos obtener el contenido del cuerpo. Pero ¿cómo puedo quitar el html como lo he mostrado en la salida?

Gracias de antemano :)

+1

Ver [esta pregunta] (http://stackoverflow.com/questions/846994/how-to-use-html -agility-pack) para algunos enlaces de HTML Agility Pack. Supongo que tienes que llamar algo así como la propiedad 'InnerText' en' HtmlNode'. –

Respuesta

5

Usted puede utilizar el cuerpo InnerText:

string html = @" 
<html> 
    <title>title</title> 
    <body> 
      <h1> This is a big title.</h1> 
      How are doing you? 
      <h3> I am fine </h3> 
      <img src=""abc.jpg""/> 
    </body> 
</html>"; 

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
string text = doc.DocumentNode.SelectSingleNode("//body").InnerText; 

A continuación, es posible que desee colapsar espacios y nuevas líneas:

text = Regex.Replace(text, @"\s+", " ").Trim(); 

Nótese, sin embargo, que si bien está trabajando en este caso, el marcado como hello<br>world o hello<i>world</i> se convertirá por InnerText en helloworld - eliminando las etiquetas. Es difícil resolver ese problema, ya que la visualización está determinada por el CSS, no solo por el marcado.

+2

Nota htat "/ html/body" para xpath es mucho más rápido. –

+0

Da un error. No se puede encontrar el espacio de nombres para HtmlDocument. – ShaileshDev

+0

@ Er.ShaileshS.Bankar - ¿Tiene la biblioteca [Html Agility Pack] (https://htmlagilitypack.codeplex.com/)? – Kobi

3

¿Cómo sobre el uso de la expresión XPath '//body//text()' para seleccionar todos los nodos de texto?

1

Normalmente para analizar html, recomendaría un analizador de HTML, sin embargo, dado que desea eliminar todas las etiquetas html, una simple expresión regular debería funcionar.

1

Puede utilizar NUglify que soporta la extracción de texto de HTML:

var result = Uglify.HtmlToText("<div> <p>This is <em> a text </em></p> </div>"); 
Console.WriteLine(result.Code); // prints: This is a text 

Como está utilizando un analizador personalizado HTML 5, que debería ser bastante robusto (especialmente si el documento no contiene ningún error) y es un muy rápido (sin regexp involucrado pero un analizador de descenso recursivo puro, más rápido que HtmlAgilityPack y más compatible con GC)

+0

Parece que está usando 'HtmlAgilityPack' bajo el capó, como lo sugiere la respuesta aceptada. –

+0

@XavierPoinas no, NUglify no está utilizando 'HtmlAgilityPack', tiene su propio analizador personalizado HTML5. – xoofx

+0

Lo sentimos, tienes razón. Lo vi en el proyecto, pero solo está allí para fines de evaluación comparativa. –

Cuestiones relacionadas