0

次のコードを書いて<div id=aaa-bbb>と next</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 ドキュメント全体で 1 回だけ表示されます。

<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 パーサーを使用するとはるかに簡単になります。私が選んだパーサーはMojoliciousスイートの一部であるMojo::DOMです。

#!/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 に答える