【问题标题】:Perl's HTML::Element - dumping just the descendants as HTMLPerl 的 HTML::Element - 仅将后代转储为 HTML
【发布时间】:2013-01-21 17:07:10
【问题描述】:

我在尝试输出我正在解析的匹配节点的内容时遇到问题:

<div class="description">some text <br/>more text<br/></div>

我使用HTML::TreeBuilder::XPath 来查找节点(这个类只有一个div):

my $description = $tree->findnodes('//div[@class="description"]')->[0];

它找到了节点(我相信返回为HTML::Element)但$description-&gt;as_HTML 也包含元素本身 - 我只希望元素中包含的所有内容都是 HTML:

some text <br/>more text<br/>

我显然可以用正则表达式去掉它,但这感觉很乱,我确定我只是在某处缺少一个函数来做它?

【问题讨论】:

    标签: perl xpath html-parsing html-tree


    【解决方案1】:

    尝试这样做:

    my $description = $tree->findnodes('//div[@class="description"]/text()')->[0];
    

    这是一个 Xpath 技巧。

    【讨论】:

    • 返回一个 HTML::TreeBuilder::XPath::TextNode 类型的对象,它没有 'as_HMTL' 方法(而且我似乎找不到任何关于它的作用的文档提供)
    【解决方案2】:

    使用./node() 获取所有子节点,包括文本和元素。

    my $description = $tree->findnodes('//div[@class="description"]/node()');
    

    【讨论】:

    • 它和使用 text() 有同样的问题,返回的对象是 HTML::TreeBuilder::XPath::TextNode 我不知道如何处理它。
    • 这个调用会返回多个节点(包含所有节点),所以它应该是一个包含所有元素的容器。它将以标量模式返回一些列表或 Tree::XPathEngine::NodeSet 对象(您正在强制它)。您可能必须以某种方式迭代结果。哦,看看最后的-&gt;[0],我想这里可能是错误的(因为你想要所有节点,而不仅仅是第一个)。我从我的答案中删除了它。
    • 是的,查看列表返回了 HTML::TreeBuilder::XPath::TextNodeHTML::Element 的混合体,它们本身就是列表。仅仅为了完成我想要的事情会非常繁琐和烦人,所以按照这个速度,我还不如用正则表达式摆脱父标签!
    • 如果你应用正则表达式,你应该对字符串感到满意吗?你知道findnodes_as_string
    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2012-02-08
    • 2019-03-13
    • 2010-11-10
    • 1970-01-01
    • 2016-10-12
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多