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

Wer*_*eng 3 perl mojo-dom

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

<h2>Description</h2>This text is the description<div class="footer">[<a href="/contrib/rev/1597/2795/">Edit description</a>
Run Code Online (Sandbox Code Playgroud)

我已经能够找到标题,但是之后不知道如何访问文本,因为我没有标签来跳转到...

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

谁能向我推荐一种方法来获取“此文字为描述”字符串?

zdi*_*dim 5

可以遍历所有节点,也可以捕获不在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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

h2通过询问先前的文本节点(h2标签的文本)或其父节点(标签),可以添加更多有关哪些节点真正有意义的标准(除非实际上是所有此类节点)。

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

我已经用更复杂的HTML进行了测试;以上是可测试的标记。


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