3

我正在尝试使用 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;

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

4

2 回答 2

4

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

于 2019-08-08T07:13:42.030 回答
2

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

#!/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();
于 2019-08-08T05:10:00.593 回答