【问题标题】:How do I find attributes starting with a specific value using HTML Agility Pack?如何使用 HTML Agility Pack 查找以特定值开头的属性?
【发布时间】:2015-04-01 10:15:30
【问题描述】:

我试图在 HTML 文档中查找以特定值开头的任何属性。我似乎对此有一个有效的 XPath 查询,但在使用 HTML Agility Pack 时它什么也不返回。

我知道我可以使用 Linq,但我正在尝试重用现有功能并利用 XPath 查询。

示例 HTML

<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>Loren ipsum</p>
<a href="http://www.myurl.com" onclick="myFunction()"></a>
</body>
</html>

XPath 查询

//*/@*[starts-with(name(), 'on')]

这可以使用 HTML Agility Pack 吗?

【问题讨论】:

    标签: html xpath html-agility-pack


    【解决方案1】:

    使用 HtmlAgilityPack (HAP) 和 XPath 函数 name() 对我不起作用,但用 local-name() 替换 name() 就可以了:

    //*/@*[starts-with(local-name(), 'on')]
    

    但是,SelectSingleNode()SelectNodes() 都只能返回 HtmlNode(s)。当 XPath 表达式选择属性而不是节点时,将返回属性的所有者节点。所以最后还是需要通过XPath以外的一些选项来获取属性,例如:

    HtmlDocument doc;
    ......
    var link = doc.DocumentNode
                  .SelectSingleNode("//*/@*[starts-with(local-name(), 'on')]");
    var onclick = link.Attributes
                      .First(o => o.Name.StartsWith("on"));
    

    【讨论】:

    • name()local-name() 之间的区别似乎很奇怪——如果属性不在命名空间中(就像上面输入文档的情况一样),两个函数的返回值应该完全相同。如果不是这种情况,您应该考虑报告错误。
    • 谢谢,我不知道 local-name() 但我同意 Mathias 的观点,这似乎有点奇怪。
    • 我在 Html Agility Pack 项目中提出了一个问题,如果有任何问题会更新htmlagilitypack.codeplex.com/workitem/35920
    【解决方案2】:

    您的 XPath 表达式是正确的。将您显示的文档 sn -p 作为输入,结果是

    onclick="myFunction()"
    

    所以,是的,这绝对是可能的,XPath 在这里没有错,问题出在其他地方。也许您可以显示调用表达式的代码?你用SelectSingleNode()吗?

    【讨论】:

    • 正如 Mathias 所说,您可能想要查看您的 c# 代码而不是 Xpath,例如 var someValue = documenturl.DocumentNode.SelectNodes("XPATH")[0].Attributes["onclick"].Value ;
    • 使用的方法是SelectNodes(),用SelectSingleNode()测试还是没有结果。
    • @Helmer 如问题中所述,我希望理想情况下使用单个 XPath 查询来执行此操作。我可以用另一种方式达到结果,我只是尽量不这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2014-05-17
    • 2016-05-15
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多