0

<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 and 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 中已经有双引号。

4

1 回答 1

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找到第一个(或在您的情况下,仅)。这#是 id 的CSS选择器语法。

于 2013-01-06T04:39:42.777 回答