使用XPath(和HtmlAgilityPack)从Html表格中选择所有链接

3
我想要实现的是提取所有链接,这些链接具有以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的推荐或最佳实践,我不是很清楚。如果我查询文档两次,是否会增加负担?


在我的解决方案中,我提供了一个单一的XPath表达式来选择所有三个不同的<a>节点。此外,它比在文档中查找所有<a>节点(如另一个答案建议的//a)更精确和高效。 - Dimitre Novatchev
2个回答

3

用途:

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

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

2
问题在于您选择了表格,然后立即尝试选择锚点,就好像它们是直接的后代一样。中间有和标签。

因此,如果您将xpath更改为以下内容,则应该可以正常工作:
"tbody/tr/td/a[starts-with(@href, 'https://')]"

如果您的锚点被包含在其他元素中,这种方法就无法奏效,所以您需要选择当前节点集合(即表格)中的所有锚点:

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

请参阅此页面,了解有关xpath语法的更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接