在特定的<div>标记之间获取html内容</div>

时间:2013-01-05 20:39:45

标签: perl html-parsing

我编写了以下代码来抓取<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::MechanizeWWW::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中已经有双引号。

1 个答案:

答案 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选择器语法。

相关问题