c# htmlagilitypack解析其他然后是firebug



im使用 HtmlAgilityPack解析html节点,我使用firebug搜索即时查找的节点属性,例如带有类名称为" abc"的div我注意到有时候我没有为DIV IM寻找结果,我会调试一下,发现来自Firebug和HtmlAgilityPackXPATH在相同的节点上是不同的:S

/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

第一个是火药。纽约知道我在哪里错了?

有两个可能的原因

  1. html敏捷套件无法正确解析html
  2. 加载页面后,网页已通过客户端脚本更改。当您使用Firebug查看时,您正在查看DOM,而不是HTML源。HAP只能使用HTML来源。

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

HAP的一种替代方法是Csquery(在Nuget上),它使用符合标准的HTML解析器(实际上 - 与Firefox相同的解析器)。CSQUERY是一个C#jQuery端口,可与CSS选择器(不是XPath)一起使用。它应该给您一个与浏览器显示的DOM相匹配的。如果问题仅仅是JavaScript正在更改DOM,则不会更改任何内容。

html敏捷性包仅集中在标记上。它不知道如何呈现事物。我认为Firebug依赖于当前的传火内存DOM,这可能会大不相同。这就是为什么您会看到诸如tbody之类的元素,这些元素仅存在于DOM中,而不是在标记中(它们是可选的)。

加上您可以添加给定XML节点的无限XPath表达式的事实。

无论如何,通常,使用HTML敏捷性包进行查询时所需的XPath不需要工具可以给出的完整XPath表达式。您只需要专注于判别因素,例如特定属性(例如类),ID等。...您的代码将对更改具有更大的抵抗力。但这意味着您需要学习一些有关XPATH的知识(这是一个很好的起点:XPath教程)。因此,您真的想构建这样的XPath表达:

//div[@class = 'ABC']

将获得所有div元素的类属性,名为" ABC"。

相关内容

最新更新