【问题标题】:Select all links from a Html table using XPath (and HtmlAgilityPack)使用 XPath(和 HtmlAgilityPack)从 Html 表中选择所有链接
【发布时间】:2010-03-20 22:11:18
【问题描述】:

我想要实现的是提取所有带有以 http://、https:// 或 / 开头的 href 属性的链接。这些链接位于具有特定类的表中(tbody > tr > td 等)。我以为我可以只指定 a 元素而不指定它的整个路径,但它似乎不起作用。我在选择链接的行收到 NullReferenceException:

var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
    foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
    {
        //not working

我不知道有关 XPath 的任何建议或最佳实践。两次查询文档时会产生开销吗?

【问题讨论】:

  • 在我的解决方案中,我为应该选择的所有三个不同的<a> 节点提供了一个 XPath 表达式。此外,在文档中查找所有<a> 节点更加精确和高效(正如另一个答案所建议的那样——//a)

标签: c# xpath html-agility-pack


【解决方案1】:

使用

 //tbody/descendant::a[starts-with(@href,'https://')
                     or
                       starts-with(@href,'http://')
                     or
                       starts-with(@href,'./') 
                      ]

您仍然会遇到问题,除非您更正代码以反映XmlNode.SelectNodes() 实例方法的返回类型为XmlNodeList,而不是HtmlNode。。

【讨论】:

    【解决方案2】:

    问题是您正在选择桌子,然后立即尝试选择锚点,就好像它们是直接死者一样。中间有trtd标签。

    因此,如果您将 xpath 更改为以下内容,则一切正常:

    "tbody/tr/td/a[starts-with(@href, 'https://')]"
    

    如果您的锚点被包裹在其他东西中,这将不起作用,因此您可以选择当前节点集(即表)中的 所有 个锚点:

    "//a[starts-with(@href, 'https://')]"
    

    有关 xpath 语法的更多详细信息,请参阅 this

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多