Xpath 在 Perl 中不工作,但在浏览器中工作

Posted

技术标签:

【中文标题】Xpath 在 Perl 中不工作,但在浏览器中工作【英文标题】:Xpath not working in Perl but works in browser 【发布时间】:2021-07-14 02:57:18 【问题描述】:

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

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 从同一来源获取了一些其他数据。

怎么可能?

【问题讨论】:

不适用于什么数据? 数据很简单——商店一周中每一天的营业时间,例如“09:00 - 21:00” $tree->findvalue('(.//table[@class="tab openTab"]/tbody/tr/td/text())[1]') 肯定不会为09:00 - 21:00 返回任何内容(undef?空字符串?)。由于该文档中完全没有任何tabletbodytrtd 元素,这不足为奇。 你能解释一下为什么以及为什么它可以在控制台上使用 $x(...) 工作吗? 您的浏览器添加了隐含的 TBODY 元素 【参考方案1】:

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

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

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

【讨论】:

以上是关于Xpath 在 Perl 中不工作,但在浏览器中工作的主要内容,如果未能解决你的问题,请参考以下文章

MySql 查询在 PHPmyadmin 中工作,但在 codeigniter 中不工作

innerHTML 在 FF 中工作,但在 IE 中不工作!

查询在 PHPMyAdmin 中工作但在 PHP 中不工作

<button> 在 chrome 中工作,但在 Firefox 中不工作 - 为啥?

python串口代码在windows中工作,但在linux中不工作

查询在 SQL Server 中工作,但在 RODBC 中不工作