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?空字符串?)。由于该文档中完全没有任何table
、tbody
、tr
和td
元素,这不足为奇。
你能解释一下为什么以及为什么它可以在控制台上使用 $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 中不工作!
<button> 在 chrome 中工作,但在 Firefox 中不工作 - 为啥?