我编写了以下代码来抓取<div id=aaa-bbb>
和下一个</div>
标记之间的文本内容,但它只打印出整个HTML源代码。
use LWP::Simple;
$url = 'http://domain.com/?xxxxxxx';
my $content = get($url);
$data =~ m/<div id="aaa-bbb">(.*?)<\/div>/g;
if (is_success(getprint($url))) {
print $_;
}
# or using the following line directly without if statement
print $data;
我感兴趣的HTML片段如下:
<div id="aaa-bbb">
<p>text text text text text text text text text</p><p>text text text</p>
</div>
特定的div
标记ID在整个HTML文档中只出现一次。
我还希望删除<p></p>
标签或通过换行符整理输出,以便以后存储为文本文件或重复使用。
在阅读了我尝试过的有价值的评论之后
WWW::Mechanize
和
WWW::Mechanize::TreeBuilder
相反,像这样
use strict;
use warnings;
use WWW::Mechanize;
use WWW::Mechanize::TreeBuilder;
my $mech = WWW::Mechanize->new;
WWW::Mechanize::TreeBuilder->meta->apply($mech);
$mech->get( 'domain.com/?xxxxxx' );
my @list = $mech->find('div id="aaa-bbb"'); # or <div id="aaa-bbb"> or "<div id="aaa-bbb">"
foreach (@list) {
print $_->as_text();
}
它适用于简单标记,但无法使其与<div id="aaaa">
一起使用。它只是退出脚本而不打印任何东西。我使用了双引号和单引号,它在标签ID中已经有双引号。
答案 0 :(得分:5)
使用DOM解析器,这种类型的解析更容易。我选择的解析器是Mojo::DOM,它是Mojolicious套件的一部分。
#!/usr/bin/env perl
use strict;
use warnings;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $dom = $ua->get( 'domain.com/?xxxxxx' )->res->dom;
my $text = $dom->at('#aaa-bbb')->all_text;
at
方法是find
方法的特例,它查找所有实例; at
找到第一个(或者仅在您的情况下)。 #
是ids的CSS选择器语法。