2015-10-09 127 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();