【问题标题】:Traverse DOM with HTML Agility Pack使用 HTML 敏捷包遍历 DOM
【发布时间】:2014-09-03 22:06:23
【问题描述】:

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

例如,当我到达带有“some-class”类的td 时,我想去第三个兄弟td 并获取其嵌套hrefanchor

<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 的相关锚点?

【问题讨论】:

  • 到目前为止,这可行(但感觉非常笨拙)...HtmlNode siblingAnchor = node.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.FirstChild.NextSibling;
  • 这实际上是获取特定兄弟节点的合理代码(如果您可以容忍偶尔的NullRefferenceException,如果 HTML 更改)。我建议阅读一些基本的 XPath 教程,以便能够更精确/更快地选择元素(即 "//" 必须搜索整个树以进行匹配,通常您可以将搜索范围缩小到至少某个特定的子树,您也可以直接用 XPath 匹配属性)。
  • @AlexeiLevenkov HTML 应该是静态的,如果它发生变化,我将能够在程序的输出中进行验证。我将深入研究 XPath 教程以了解如何进行优化。再次感谢您将我推荐给 HTMLAgilityPack,顺便说一句:)

标签: c# html asp.net .net html-agility-pack


【解决方案1】:

学习 XPath,您的工作会轻松很多。例如,要获取 &lt;td&gt; 元素的 class 属性等于“some-class”,我们可以使用这个 Xpath :

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

为了获得第三个下一个兄弟&lt;td&gt;

/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", "");

第二个参数是默认值,当属性未找到时返回。

【讨论】:

  • 如果td 有多个类(td class="one_class two_class"),就会出现问题。除此之外,它的简单是美丽的。 stackoverflow.com/questions/1604471/… 处理多个类。
  • @JonP 您链接的帖子确实包含有用的信息。我的回答只是没有尝试涵盖所有可能的问题,除非它清楚地反映在 OP 的示例标记中,以保持简单
  • 我同意,尽可能简单,尽可能长。
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2011-06-04
  • 2010-10-25
相关资源
最近更新 更多