【发布时间】:2016-11-14 05:02:49
【问题描述】:
HTML::TreeBuilder::XPath 中的 findvalue 函数返回由 xpath 查询找到的任何值的串联。
为什么要这样做,这些值的串联如何对任何人有用?
【问题讨论】:
标签: string perl xpath concatenation html-treebuilder
HTML::TreeBuilder::XPath 中的 findvalue 函数返回由 xpath 查询找到的任何值的串联。
为什么要这样做,这些值的串联如何对任何人有用?
【问题讨论】:
标签: string perl xpath concatenation html-treebuilder
为什么要这样做?
当您调用findvalue 时,您请求的是单个标量值。如果有多个匹配项,则必须将它们组合成一个值以某种方式。
来自HTML::TreeBuilder::XPath 的文档:
查找值($path)
...如果路径返回 NodeSet,则会自动为您调用
$nodeset->xpath_to_literal(因此返回 Tree::XPathEngine::Literal)。
并且来自Tree::XPathEngine::NodeSet的文档:
xpath_to_literal()
返回列表中所有节点的所有字符串值的串联。
另一种方法是返回 Tree::XPathEngine::NodeSet 对象,以便用户自己遍历结果,但 findvalues 方法已经返回一个列表。
这些值的串联如何对任何人有用?
例如:
use strict;
use warnings 'all';
use 5.010;
use HTML::TreeBuilder::XPath;
my $content = do { local $/; <DATA> };
my $tree = HTML::TreeBuilder::XPath->new_from_content($content);
say $tree->findvalue('//p');
__DATA__
<p>HTML is just text.</p>
<p>It can still make sense without the markup.</p>
输出:
HTML is just text.It can still make sense without the markup.
不过,通常情况下,获取匹配列表并遍历它们而不是进行愚蠢的连接更有意义,因此如果可以有多个匹配,则应使用 findvalues(复数)。
【讨论】:
look_down 在HTML::Element.
HTML::Element中的look_down错了吗?
HTML::Element 中的look_down 有何看法?它返回标量上下文中的第一个匹配项和列表上下文中的所有匹配项。
使用
( $tree->findvalues('//p') )[0] ;
改为。
【讨论】: