【问题标题】:Bug in HTMLAgilityPack when getting href attribute value. C#获取 href 属性值时 HTMLAgilityPack 中的错误。 C#
【发布时间】:2021-03-22 01:44:50
【问题描述】:

在 HTMLAgilityPack 中发现了一个令人讨厌的错误,其中某些属性值未完全返回 - 它们被截断。具体来说,当尝试从锚标记中获取 href 值时,仅返回根域,后面的任何内容(查询字符串)都将被完全忽略。有人知道一个好的解决方法吗?

例子:

node.SelectSingleNode("//link").Attributes["href"].Value

返回https://www.example.com 而不是返回 https://www.example.com/mypage.php?_src=ffk_title&ffkid=66534&site=data:http%3A%2F%2Fwww.othersite.com%2Frss%2F

链接是这样的

<a class="tlink" href="https://www.example.com/mypage.php?_src=ffk_title&amp;ffkid=66534&amp;site=data:http%3A%2F%2Fwww.othersite.com%2Frss%2F" target="_blank">Click to get feed</a>

无论如何 - 现在,我将只获取链接标记并使用旧方法进行解析 - 我认为如果 href 标记中存在非典型字符,HTMLAgilityPack 会感到困惑。我希望这只是我做错了什么,但这种怪癖真的很伤人。

【问题讨论】:

  • 你能提供你的实际代码吗? //link 不是 //a,如果我将其更改为 doc.DocumentNode.SelectSingleNode("//a").Attributes["href"].Value,它会按照您的预期为我提供完整的 URL。那是使用 v1.11.31。

标签: c# attributes html-agility-pack


【解决方案1】:

对于锚标签,你应该使用//a XPath 表达式:

node.SelectSingleNode("//a").Attributes["href"].Value;

此外,如果您需要引用具有特定类的锚点,您可以使用:

node.SelectSingleNode("//a[@class='tlink']").Attributes["href"].Value;

here 是一个工作示例。

【讨论】:

  • 我明白我做了什么。我正在重用链接代码而不是锚标记,因为它部分工作,我认为 HTMLAgilityWebPath 的新 DotNetCore 版本有问题。我将其更改为“//a”,它工作正常。然而,有一个问题。该节点是另一个节点的子节点 - 不知道为什么 XPATH 解析器会查看父节点的父节点(即 )以获取文档中唯一的 LINK 标记。
  • @MC9000 HtmlAgilityPack 使用 XPath 语法。在 XPath 中,路径开头的// 表示“在文档中的任何位置查找”。所以//a 会在文档中找到所有锚点,即使您是从中间某个节点开始的。如果只想从当前节点向下查看后代,请使用.// 作为前缀,例如.//a。如果您只想查看当前节点的直接子节点,请完全删除前缀,例如 a
  • 谢谢。认为无论语法如何,它都受限于节点对象(所以 // 将是“在任何地方查找”,但相对于当前节点对象) - 对我来说,这将是最合乎逻辑的实现。我错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2011-06-11
  • 2016-04-25
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多