HtmlAgilityPack C#--Selectnodes始终返回Null

本文关键字:返回 Null C#--Selectnodes HtmlAgilityPack | 更新日期: 2023-09-27 18:26:27

这是我试图与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());

节点总是包含null值。。。请帮我找到解决这个问题的方法。。。非常感谢。

HtmlAgilityPack C#--Selectnodes始终返回Null

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轴步长替换为偏心或自步长//,但这可能会跳到"内部表"中:

//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']