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

Xpath在Perl中不起作用,但在浏览器中起作用,perl,parsing,xpath,Perl,Parsing,Xpath,我正在尝试使用以下命令从表单元格获取数据: 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]”

我正在尝试使用以下命令从表单元格获取数据:

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


怎么可能呢?

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

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


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

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

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


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

不适用于什么数据?数据非常简单-商店每周每一天的营业时间,例如“09:00-21:00”
$tree->findvalue(“(../table[@class=“tab openTab”]/tbody/tr/td/text())[1]”)
对于
09:00-21:00
,肯定不会返回任何内容(未定义?空字符串?)。这并不奇怪,因为该文档中完全没有任何
tbody
tr
td
元素。请您解释一下为什么它可以在控制台上使用$x(…)然后呢?你的浏览器添加了隐含的TBODY元素对什么数据不起作用?数据非常简单-商店每周每天的营业时间,例如“09:00-21:00”
$tree->findvalue(“(../table[@class=“tab openTab”]/TBODY/tr/td/text())[1]”
对于
09:00-21:00
,肯定不会返回任何内容(未定义?空字符串?)。由于该文档中完全没有任何
tbody
tr
td
元素,因此这并不奇怪。请您解释一下为什么以及为什么它在控制台中使用$x(…)工作?您的浏览器会添加隐含的tbody元素