这是我试图与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());
节点始终包含空值... 请帮我找到解决这个问题的方法...... 谢谢..
答案 0 :(得分:0)
<tbody/>
个标签用于构建XPath表达式的所有常见浏览器扩展都可以在DOM上运行。与HTML规范相反,DOM规范要求<tr/>
元素位于<tbody/>
元素内,因此浏览器会在缺少时添加此类元素。如果使用Firebug(或使用DOM的类似开发人员工具)查看HTML源代码而不是显示页面源代码(使用wget
或类似的工具,如果有必要则不解释任何内容),您可以轻松看到差异。/ p>
删除/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']