2015-10-09 163 views
2

我想從任何html文檔中獲取所有htmlDocument節點的所有innerText。如何遍歷所有節點而不指定節點名稱

我一直在做一些研究,但還沒有找到解決方案,我將無需指定節點名稱即可瀏覽整個文檔中的所有父節點和子節點。

我想這樣做,因爲我將使用不同的html文檔,因此指定節點名稱在此時不適用於我。

回答

1

您可以使用下面的XPath表達式得到任意的HTML文檔中的所有非空文本節點,而不必知道文檔結構:

//text()[normalize-space()] 

全部工作的控制檯應用程序演示:

var html = @"<p> 
    <span>a1</span> 
    <span>a2</span> 
    <span>b1</span> 
    <span>b2</span> 
</p>"; 
var doc = new HtmlDocument(); 
doc.LoadHtml(html); 
var result = doc.DocumentNode.SelectNodes("//text()[normalize-space()]"); 
foreach (var r in result) 
{ 
    Console.WriteLine(r.InnerText); 
} 

Dotnetfiddle Demo

輸出:

a1 
a2 
b1 
b2 
1

我想通了,現在... OMG它是如此簡單,首先,因爲我不知道該如何使用這些功能

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.Load(MyIO.bingPathToAppDir("Test data/testHTML.html")); 
HtmlNode j = htmlDoc.DocumentNode; 
foreach (HtmlNode node in j.ChildNodes) 
{ 
    checkNode(node); 
} 

static void checkNode(HtmlNode node) 
{ 
    foreach (HtmlNode n in node.ChildNodes) 
    { 
     if (n.HasChildNodes) 
     { 
      checkNode(n); 
     } 
     else 
     { 
      Console.WriteLine(n.InnerText); 
     } 
    } 
} 
0

你也可以找到像這樣的所有節點:

string fsURLAddress = "http://www.external-url-sample.com/"; 

var loHtmlDocument = new HtmlWeb().Load(fsURLAddress); 

var loHTMLNodeList = loHtmlDocument.DocumentNode.Descendants().ToList();