Toma todo el texto de html con Html Agility Pack

Entrada

foo bar baz

Salida

 foo bar baz 

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

 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ías iterar a través de algo que no sea DescendantNodesAndSelf para un rendimiento óptimo.

XPATH es tu amigo 🙂

 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"

foo bar baz

"); foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//text()")) { Console.WriteLine("text=" + node.InnerText); }
 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:

 

foo bar baz

producirá el siguiente resultado:

 foo bar baz 

Estaba en la necesidad de una solución que extraiga todo el texto, pero descarte el contenido de las tags de guiones y estilos. No pude encontrarlo en ninguna parte, pero se me ocurrió lo siguiente que se adapta a mis necesidades:

 StringBuilder sb = new StringBuilder(); IEnumerable 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); 
 public string html2text(string html) { HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(@"" + html + ""); return doc.DocumentNode.SelectSingleNode("//body").InnerText; } 

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