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



我正在尝试使用Mojo::D OM从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;

谁能向我推荐一种如何获取"此文本是描述"字符串的方法?

可以遍历所有节点,也可以捕获那些不在 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捕获所需的文本。但是,在更复杂的片段中,情况并非如此,其中寻求的文本不在第一个元素之后。

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

#!/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();

最新更新