【问题标题】:HTML::TreeBuilder::XPath findvalue returns concatenation of valuesHTML::TreeBuilder::XPath findvalue 返回值的串联
【发布时间】:2016-11-14 05:02:49
【问题描述】:

HTML::TreeBuilder::XPath 中的 findvalue 函数返回由 xpath 查询找到的任何值的串联。

为什么要这样做,这些值的串联如何对任何人有用?

【问题讨论】:

    标签: string perl xpath concatenation html-treebuilder


    【解决方案1】:

    为什么要这样做?

    当您调用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_downHTML::Element.
    • 没有。它不应该返回你所要求的以外的东西。如果您只想要第一个,请只要求第一个
    • @ikegami 所以你是说HTML::Element中的look_down错了吗?
    • @ikegami 那么您对HTML::Element 中的look_down 有何看法?它返回标量上下文中的第一个匹配项和列表上下文中的所有匹配项。
    • @ikegami 在对这个答案的第二条评论中,你说它不应该那样做。
    【解决方案2】:

    使用

    ( $tree->findvalues('//p') )[0] ;
    

    改为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2013-08-07
      • 2012-08-11
      • 2018-10-16
      相关资源
      最近更新 更多