2010-11-15 18 views

Odpowiedz

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

Robi to, czego potrzebujesz, ale nie jestem pewien, czy to najlepszy sposób. Być może powinieneś iterować przez coś innego niż DescendantNodesAndSelf dla optymalnej wydajności.

42

XPATH jest twoim przyjacielem :)

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

To działało znakomicie dla mnie. Wszystko, co na niego rzuciłem, nawet brzydkie fragmenty html generowane przez stary CMS. – Chris

4

byłem w potrzebie rozwiązania, które wydobywa cały tekst, ale odrzuca treść skryptu i styl tagów. Nie mogłem go nigdzie znaleźć, ale ja przyszedłem z następujących składników, które pasuje do własnych potrzeb:

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; 

Podany przykład dla treści html:

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

będzie następujący wynik:

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

Ta praca około jest oparte na Html Agility Pack. Możesz również zainstalować go przez NuGet (nazwa pakietu: HtmlAgilityPack).

Powiązane problemy