¿Cómo puedo extraer solo texto del html?

c# html-agility-pack

Pregunta

Tengo el requisito de extraer todo el texto que está presente en el <body> del html. Muestra de entrada de 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 usar solo HtmlAgility para este propósito. No hay expresiones regulares por favor.

Sé cómo cargar HtmlDocument y luego usar xquery como '// body' podemos obtener los contenidos del cuerpo. Pero, ¿cómo elimino el html como lo he mostrado en la salida?

Gracias por adelantado :)

Respuesta aceptada

Puedes usar el texto InnerText del cuerpo:

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 contraer espacios y nuevas líneas:

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

Sin embargo, tenga en cuenta que, si bien está funcionando en este caso, InnerText convertirá marcas como hello<br>world o hello<i>world</i> a helloworld , eliminando las etiquetas. Es difícil resolver ese problema, ya que la visualización a menudo está determinada por el CSS, no solo por el marcado.


Respuesta popular

¿Qué hay de usar la expresión XPath '//body//text()' para seleccionar todos los nodos de texto?



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué