3

如何使用 Html Agility Pack 获取 html 页面上的所有 div id。我正在尝试获取所有 id 并将它们放入一个集合中。

<p>
    <div class='myclass1'>
        <div id='f'>
        </div>  
        <div id="myclass2">
            <div id="my"><div id="h"></div><div id="b"></div></div>
        </div>
    </div>
</p>

代码:

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.OptionFixNestedTags=true;
htmlDoc.Load(filePath);    
HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("div"); 

如何获取所有 div id 的集合?

4

2 回答 2

3

如果您只需要 ID,则可以获取这些id属性节点的集合,而不是获取div元素节点的集合。例如:

List<string> ids = new List<string>();
foreach(XmlNode node in doc.SelectNodes("//div/@id"))
{
    ids.Add(node.InnerText);
}

这将跳过div没有 ID 的<div class='myclass1'>元素,例如您的示例中的元素。

"//div/@id"是一个 XPath 字符串。XPath 是一种很容易学习的技术,如果您处理大量 XML,或者在这种情况下,通过敏捷包库处理 HTML,则可以很方便地学习。XPath 是一种行业标准,允许您在 XML 文档中选择匹配的节点。

  • //表示您希望它选择以下节点作为当前节点的子节点,或其任何后代。由于当前节点是文档的根节点,这将在文档中的任何位置找到匹配的节点。
  • div是我们要匹配的元素名称。因此,在这种情况下,我们告诉它div在文档中的任何位置查找所有元素。
  • /表示您想要一个子节点。在这种情况下,id属性是元素的子节点div,所以首先我们说我们想要div元素,然后我们需要正斜杠来表示我们想要div元素的子节点之一。
  • @id意味着我们想要找到所有的id属性。该@符号表示它是属性名称而不是元素名称。
于 2012-07-17T16:35:06.743 回答
2

哟可以通过传递xpath语法得到div的集合

像这样

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

    htmlDoc.OptionFixNestedTags=true;

    htmlDoc.Load(filePath);

 foreach(HtmlNode div doc.DocumentElement.SelectNodes("//div"))
 {
///.. code here
 }
于 2012-07-17T16:23:44.993 回答