Xpath 在 Perl 中不起作用,但在浏览器中起作用

Xpath not working in Perl but works in browser

我正在尝试使用以下方法从 table 单元格中获取数据:

my $data = $tree->findvalue('(.//table[@class="tab openTab"]/tbody/tr/td/text())[1]');

这个 XPath (.//table[@class="tab openTab"]/tbody/tr/td/text())[1] 在浏览器中用 $ 测试它时工作完美x('(.//table[@class="tab openTab"]/tbody/tr/td/text())[1]') 但拒绝在 Perl 中工作(没有返回数据)。 Perl 代码很好,因为我使用相同的 $tree 从同一来源获取了一些其他数据。

怎么可能?

从技术上讲,每个 table 都有一个 TBODY 元素,即使它的开始和结束标记都被省略了。您的浏览器知道这一点,并在其对象树中创建一个 TBODY。

XML::LibXML 只是一个 XML 解析器。与 HTML 所基于的 SGML 不同,XML 没有隐含元素的概念。 XML::LibXML 支持 HTML 语法,但无论是解析 XML 还是 HTML,文档解析器 returns 都是文件中实际内容的表示。如果在文件中找到 none,则不添加 TBODY 元素。

因此 table/tbody/tr/td 对于您的浏览器创建的树是 suitable,但对于提供给 XML::LibXML 的文件不是 suitable。