2010-11-15 7 views

Répondre

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()); 
    } 
} 

Cela fait ce que vous avez besoin, mais je ne suis pas sûr que ce soit la meilleure façon. Peut-être devriez-vous parcourir autre chose que DescendantNodesAndSelf pour des performances optimales.

42

XPATH est votre ami :)

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

Cela a fonctionné avec brio pour moi. Tout ce que je lui ai jeté, même des fragments html merdiques générés par un ancien CMS. – Chris

4

J'étais dans le besoin d'une solution qui extrait tout le texte, mais supprime le contenu des balises de script et de style. Je ne pouvais pas le trouver nulle part, mais je suis venu avec ce qui suit, qui correspond à mes propres besoins:

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; 

L'exemple spécifié pour le contenu html:

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

produira la sortie suivante:

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; 
} 

Ce travail autour est basé sur Html Agility Pack. Vous pouvez également l'installer via NuGet (nom du package: HtmlAgilityPack).

Questions connexes