HtmlAgilityPack C#--- Selectnodes始终返回Null

时间:2013-08-04 15:08:24

标签: c# xpath html-parsing html-agility-pack

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

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

1 个答案:

答案 0 :(得分: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替换//轴步,但这可能会跳到“内部表”中:

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