usar parser parse htmlagilitypack como agility c# html-agility-pack

c# - parser - htmlagilitypack nuget



Agarra todo el texto de html con Html Agility Pack (5)

Entrada

<html><body><p>foo <a href=''http://www.example.com''>bar</a> baz</p></body></html>

Salida

foo bar baz

Sé de htmldoc.DocumentNode.InnerText , pero le dará foobarbaz : quiero obtener cada texto, no todos a la vez.


Necesitaba una solución que extraiga todo el texto, pero descarta el contenido de las etiquetas de estilo y script. No pude encontrarlo en ninguna parte, pero se me ocurrió lo siguiente que se adapta a mis propias necesidades:

StringBuilder sb = new StringBuilder(); IEnumerable<HtmlNode> nodes = doc.DocumentNode.Descendants().Where( n => n.NodeType == HtmlNodeType.Text && n.ParentNode.Name != "script" && n.ParentNode.Name != "style"); foreach (HtmlNode node in nodes) { Console.WriteLine(node.InnerText);


XPATH es tu amigo :)

HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"<html><body><p>foo <a href=''http://www.example.com''>bar</a> baz</p></body></html>"); foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//text()")) { Console.WriteLine("text=" + node.InnerText); }


public string html2text(string html) { HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(@"<html><body>" + html + "</body></html>"); return doc.DocumentNode.SelectSingleNode("//body").InnerText; }

Esta solución está basada en Html Agility Pack . También puede instalarlo a través de NuGet (nombre del paquete: HtmlAgilityPack ).


var pageContent = "{html content goes here}"; var pageDoc = new HtmlDocument(); pageDoc.LoadHtml(pageContent); var pageText = pageDoc.DocumentNode.InnerText;

El ejemplo especificado para el contenido html:

<html><body><p>foo <a href=''http://www.example.com''>bar</a> baz</p></body></html>

producirá la siguiente salida:

foo bar baz


var root = doc.DocumentNode; var sb = new StringBuilder(); foreach (var node in root.DescendantNodesAndSelf()) { if (!node.HasChildNodes) { string text = node.InnerText; if (!string.IsNullOrEmpty(text)) sb.AppendLine(text.Trim()); } }

Esto hace lo que necesita, pero no estoy seguro de si esta es la mejor manera. Tal vez debería iterar a través de algo que no sea DescendantNodesAndSelf para obtener un rendimiento óptimo.