2010-11-15 17 views
17

इनपुट के साथ एचटीएमएल से सभी पाठले लो एचटीएमएल चपलता पैक

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

आउटपुट

foo 
bar 
baz 

मैं htmldoc.DocumentNode.InnerText के बारे में पता है, लेकिन यह foobarbaz दे देंगे - मैं प्रत्येक पाठ प्राप्त करना चाहते हैं, बिल्कुल नहीं एक पर पहर।

उत्तर

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

यह आपको जो चाहिए वह करता है, लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है या नहीं। शायद आपको इष्टतम प्रदर्शन के लिए DescendantNodes और स्वयं के अलावा किसी अन्य चीज़ के माध्यम से पुन: प्रयास करना चाहिए।

42

XPATH अपने दोस्त :)

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

यह मेरे लिए शानदार ढंग से काम किया। सब कुछ मैंने उस पर फेंक दिया, यहां तक ​​कि पुराने सीएमएस द्वारा उत्पन्न क्रैपी एचटीएमएल टुकड़े भी। – Chris

4

मैं एक समाधान है कि सभी पाठ निकालता है लेकिन स्क्रिप्ट और स्टाइल टैग के सामग्री को छोड़ देता है की जरूरत होती थी। मैं इसे कहीं भी नहीं मिल सकता है, लेकिन मैं जिसके बाद मेरे अपने की जरूरत है सूट के साथ आया था:

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; 

html सामग्री के लिए निर्दिष्ट उदाहरण:

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

निम्नलिखित उत्पादन का उत्पादन होगा:

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

इस काम चारों ओर Html Agility Pack पर आधारित है। आप इसे NuGet (पैकेज नाम: HtmlAgilityPack) के माध्यम से भी इंस्टॉल कर सकते हैं।

संबंधित मुद्दे