我正在尝试使用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;
谁能向我推荐一种方法来获取“此文字为描述”字符串?
可以遍历所有节点,也可以捕获不在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捕获了所需的文本。但是,在更复杂的片段中情况并非如此,在这些片段中,要查找的文本不会出现在第一个元素之后。