【问题标题】:Xpath not working in Perl but works in browserXpath 在 Perl 中不工作,但在浏览器中工作
【发布时间】: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 元素

标签: perl parsing xpath


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2021-05-10
    • 2023-03-19
    • 2015-09-20
    • 2011-06-05
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多