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值。。。请帮我找到解决这个问题的方法。。。非常感谢。
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']