0

这是我尝试与 HtmlAgilityPack C# 解析器一起使用的 xpath 文本。

//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']

我尝试使用 firefox xpath add=on 评估 xpath 表达式并成功获得所需的项目。但是 c# 代码返回 Null 异常。

HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");            
MessageBox.Show(node.ToString());

该节点始终包含空值...请帮助我找到解决此问题的方法...谢谢..

4

1 回答 1

0

DOM 需要<tbody/>插入标签

所有用于构建 XPath 表达式的常见浏览器扩展都适用于 DOM。与 HTML 规范相反,DOM 规范要求<tr/>元素位于<tbody/>元素内部,因此浏览器会在缺少此类元素时添加此类元素。如果使用 Firebug(或在 DOM 上工作的类似开发人员工具)查看 HTML 源代码与显示页面源代码(使用wget或在必要时不解释任何内容的类似工具),您可以很容易地看到差异。

解决方案

删除/tbody轴步骤,您的 XPath 表达式可能会起作用。

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']

如果您需要支持带标签和不带<tbody/>标签的 HTML

对于更通用的解决方案,您可以将/tbody轴 step 替换为 decendant-or-self step //,但这可能会跳转到“内表”:

//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']

更好的是使用替代 XPath 表达式:

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt'] 

一个更干净的 XPath 2.0 唯一解决方案是

//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']
于 2013-08-04T21:04:43.533 回答