2010-11-15 6 views

Respuesta

6
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.

42

XPath es su 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); 
} 
+0

Esto funcionó de maravilla para mí. Todo lo que arrojé, incluso fragmentos de html horribles generados por un viejo CMS. – Chris

4

yo estaba en la necesidad de una solución que extrae todo el texto, pero descarta el contenido de las etiquetas de secuencia de comandos y de estilo. No podía encontrar en cualquier lugar, pero se le ocurrió la siguiente que se adapte a mis 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); 
5
var pageContent = "{html content goes here}"; 
var pageDoc = new HtmlDocument(); 
pageDoc.LoadHtml(pageContent); 
var pageText = pageDoc.DocumentNode.InnerText; 

El ejemplo específico para el contenido HTML:

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

producirá el siguiente resultado:

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

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

Cuestiones relacionadas