使用HTML敏捷包遍历DOM

本文关键字:遍历 DOM 包遍历 HTML 使用 | 更新日期: 2023-09-27 18:20:30

我正在用HTMLAgilityPack库解析C#中的HTML DOM,我想知道一旦到达特定元素,如何遍历DOM。

例如,当我使用类"some class"到达td时,我想转到第三个同级td并获取其嵌套anchorhref

<td class="some-class">Content I care about</td>
<td>Content I don't want</td>
<td>Content I don't want</td>
<td>    
    <a href="http://www.the-url-I-want.com">Some Amazing URL</a>
</td>

目前,我正在通过降落在我想要的td

foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    HtmlAttribute nodeClass = node.Attributes["class"];
    if(nodeClass != null && nodeClass.Value == "some-class")
    {
        //Find the anchor that is 3 siblings away
        //Do something
    }
}

有人知道我会如何使用HTMLAgility包来获取单个td的相关锚吗?

使用HTML敏捷包遍历DOM

学习XPath,您的工作会轻松很多。例如,要获得类属性等于"某个类"的<td>元素,我们可以使用以下Xpath:

//td[@class='some-class']

以及获得第三个下一个同级<td>:

/following-sibling::td[3]

所以你的循环可以重写如下:

var xpath = "//td[@class='some-class']/following-sibling::td[3]/a";
foreach(HtmlNode a in doc.DocumentNode.SelectNodes(xpath))
{
    //Do something with the anchor variable a
}

顺便说一句,更安全的获取属性值的方法是使用GetAttributeValue()方法:

var href = a.GetAttributeValue("href", "");

第二个参数是在找不到属性时返回的默认值。