【问题标题】:Select only items in a specific DIV using HtmlAgilityPack使用 HtmlAgilityPack 仅选择特定 DIV 中的项目
【发布时间】:2010-05-21 01:43:15
【问题描述】:

我正在尝试使用 HtmlAgilityPack 从页面中提取所有链接,这些链接包含在声明为 <div class='content'> 的 div 中。但是,当我使用下面的代码时,我只是获得了整个页面上的所有链接。这对我来说真的没有意义,因为我从之前选择的子节点调用 SelectNodes(在调试器中查看时仅显示来自该特定 div 的 HTML)。所以,就像每次我调用 SelectNodes 时它都会回到根节点。我使用的代码如下:

HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(@"http://example.com");
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='content']");
foreach(HtmlNode link in node.SelectNodes("//a[@href]"))
{
    Console.WriteLine(link.Value);
}

这是预期的行为吗?如果是这样,我该如何让它达到我的预期?

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

    这将起作用:

    node.SelectNodes("a[@href]")
    

    此外,您可以在单个选择器中执行此操作:

    doc.DocumentNode.SelectSingleNode("//div[@class='content']//a[@href]")
    

    另外,请注意 link.Value 没有为 HtmlNode 定义,因此您的代码无法编译。

    【讨论】:

    • 这似乎与我所知道的 XPath 不相符,但它确实有效。我也承认我刚刚第一次使用 HtmlAgilityPack 来回答这个问题。我找不到任何文档...
    • 关于link.Value,我是从记忆中重写的......它是prob InnerHtml之类的。那么 // 让它总是回到根目录吗?我没有从 W3C 上的 XPath 文档中得到这种印象
    • T​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​...无论如何,你是对的 - 以//开头的XPath应该尊重它的上下文,因为据我所知。
    • 我应该想象 // 回调到根,因为我推测即使你从树中抓取一个节点,它仍然引用整个文档,否则不可能反向遍历用 .. 爬上树。
    • Em 收到此错误。 “对象引用未设置为对象的实例。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多