0

HtmlAgilityPack用来解析 Html 节点,我使用 firebug 搜索我正在寻找的节点属性,比如类名为“ABC”的 div 我注意到有时我没有得到我正在寻找的 div 的结果,我调试它并看到对于同一个 Node:S,from firebug 和 from 是不同XPATHHtmlAgilityPack

/html[1]/body[1]/div[2]/div[3]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[2]/td[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/td[1]/div[1]

/html/body/div[3]/div[3]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/div/table/tbody/tr/td/div/table/tbody/tr[2]/td/div[2]/table/tbody/tr/td/div/div/table/tbody/tr[3]/td/table/tbody/tr/td[2]/div

第一个是萤火虫。有谁知道我哪里错了?

4

2 回答 2

0

有两个可能的原因

  1. HTML 敏捷包未正确解析 HTML
  2. 页面加载后,该网页已被客户端脚本更改。当您使用 Firebug 查看时,您看到的是 DOM,而不是 HTML 源代码。HAP 只能使用 HTML 源代码。

您会注意到在您显示的路径中(例如)HAP 版本中没有 TBODY 标记。TBODY 在 HTML 标记中是可选的,但在完整的 DOM 中仍然是必需的标记。如果缺少 TBODY,浏览器 HTML 解析器将始终添加它。HAP 不会。这可能导致在浏览器中工作的路径在 HAP 中失败

HAP 的替代方案是CsQuery(在nuget上),它使用符合标准的 HTML 解析器(实际上 - 与 Firefox 相同的解析器)。CsQuery 是一个 C# jquery 端口,它适用于 CSS 选择器(不是 xpath)。它应该为您提供与浏览器显示的 DOM 相匹配的 DOM。但是,如果问题仅仅是 javascript 正在改变 DOM,这不会改变任何事情。

于 2012-12-29T14:35:55.817 回答
0

Html Agility Pack 只专注于标记。它不知道事物将如何呈现。我认为 Firebug 依赖于当前的 in-firefox-memory DOM,这可能会有很大的不同。这就是为什么您会看到诸如 TBODY 之类的元素仅存在于 DOM 中,而不存在于标记中(它们是可选的)。

此外,您还可以添加一个事实,即给定 Xml 节点有无限可能的 XPATH 表达式。

无论如何,一般来说,使用 Html Agility Pack 进行查询时所需的 XPATH 不需要工具提供的完整 XPATH 表达式。您只需要关注判别式,例如特定属性(如类)、id 等......您的代码将更能抵抗更改。但这意味着您需要了解一些有关 XPATH 的知识(这是一个很好的起点:XPath 教程)。所以你真的想构建这样的 XPATH 表达式:

//div[@class = 'ABC']

这将获取所有具有名为“ABC”的 CLASS 属性的 DIV 元素。

于 2012-12-29T17:22:52.733 回答