使用 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
捕获了所需的文本。但是,在更复杂的片段中情况并非如此,在这些片段中,查找的文本不在第一个元素之后。
我正在尝试使用 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
捕获了所需的文本。但是,在更复杂的片段中情况并非如此,在这些片段中,查找的文本不在第一个元素之后。