使用 Mojo::DOM 在标题后提取未标记的文本

Using Mojo::DOM to extract untagged text after heading

我正在尝试使用 Mojo::DOM 从 HTML 文件中提取一些没有标签的文本(我是新手)。特别是H2标题后的描述文字(文件中还有其他标题)。

<h2>Description</h2>This text is the description<div class="footer">[<a href="/contrib/rev/1597/2795/">Edit description</a>

我已经找到了标题,但不知道如何访问后面的文本,因为我没有要跳转到的标签...

my $dom = Mojo::DOM->new( $htmlfile );
my $desc = $dom
    ->find('h2')
    ->grep(sub { $_->all_text =~ /Description/ })
    ->first;

任何人都可以向我推荐一种如何获取 "This text is the description" 字符串的方法吗?

试试这个代码,我刚刚添加了一个父元素:

#!/usr/bin/perl

use strict;
use warnings;
use Mojo::DOM;


my $html = q{<div class="container"><h2>Description</h2>This text is the description<div class="footer">[<a href="/contrib/rev/1597/2795/">Edit description</a>
</div></div>};

my $dom = Mojo::DOM->new($html);

print $dom->at('div.container')->text();

或者,使用您的 HTML 代码段,可以完成以下操作:

print $dom->text();

一个人可以遍历 所有 个节点,也可以捕获那些不在 HTML 元素(标签)内的节点。然后使用您需要跟随 h2 标记的节点这一事实。

更准确地说,它遵循作为(可识别的)h2 标记节点的子节点的文本节点。

use warnings;
use strict;
use feature 'say';

use Mojo::DOM;

my $html = q(<h2>Description</h2> This text is the description <p>More...</p>);

my $dom = Mojo::DOM->new($html);

my $is_next = 0;

foreach my $node ($dom->descendant_nodes->each) { 
    my $par = $node->parent;
    if ($node->type eq 'text' and $par->type eq 'tag' and $par->tag eq 'h2') { 
        $is_next = 1;
    }   
    elsif ($is_next) {
        say $node;       #-->   This text is the description
        $is_next = 0;
    }   
}

可以通过询问前一个文本节点(h2 标签的文本)来添加更多关于哪些 h2 节点感兴趣的标准(除非它真的是所有这些节点)或其父级(标签)。

节点本身也应该被检查,例如查看它是否确实只是松散的文本而不是下一个标签。

我测试过更复杂的 HTML;以上是一个接近最小的可测试标记。


在这个简单的示例中,$dom->text 捕获了所需的文本。但是,在更复杂的片段中情况并非如此,在这些片段中,查找的文本不在第一个元素之后。