首页 > 解决方案 > Xpath 在 Perl 中不工作,但在浏览器中工作

问题描述

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

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

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

怎么会这样?

标签: perlparsingxpath

解决方案


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

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

所以table/tbody/tr/td适合你的浏览器创建的树,但不适合提供给 XML::LibXML 的文件。


推荐阅读