スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Web::Scraperを使ったPerlプログラムの例

Web::Scraper は、スクレイピングのための Perl モジュールです。スクレイピングとは、HTML データから、不要な部分を削ぎ落とし、必要な部分だけを抽出することです。

2012年3月30日更新。

サンプルプログラム

指定した要素の内側の HTML を取得したい場合

use strict;
use warnings;

use Web::Scraper;
use Data::Dumper;

my $html_content = <<"EOT";
<html>
<head>
<title>リンク集</title>
</head>
<body>
<ul id="search">
<li><a href="http://www.gogole.com/">Google</a></li>
<li><a href="http://www.yahoo.co.jp/">Yahoo! Japan</a></li>
<li><a href="http://www.bing.com/">Bing</a></li>
</ul>
<ul id="shopping">
<li><a href="http://www.rakuten.co.jp/">楽天市場</a></li>
<li><a href="http://www.amazon.co.jp/">Amazon.co.jp</a></li>
</ul>
</body>
</html>
EOT

# 指定した要素の内側のHTMLを取得する
my $res = scraper {
  process 'li', 'li[]' => 'HTML';
}->scrape($html_content);

warn Dumper $res;

scraper {} の中の process ~ の部分で抽出方法を指示します。

process $selector, $key => $what

$selector の部分では、XPath 形式もしくは CSS セレクタ形式で抽出箇所を指定します。また、$key => $what の部分では、結果として返されるハッシュのキーの名前や、値の形式を指定します。

上のプログラムの実行結果は以下のとおり。

$VAR1 = {
          'li' => [
                    '<a href="http://www.gogole.com/">Google</a>',
                    '<a href="http://www.yahoo.co.jp/">Yahoo! Japan</a>',
                    '<a href="http://www.bing.com/">Bing</a>',
                    '<a href="http://www.rakuten.co.jp/">楽天市場</a>',
                    '<a href="http://www.amazon.co.jp/">Amazon.co.jp</a>'
                  ]
        };

指定した要素を含むHTMLを取得したい場合

最初のプログラムにおいて、EOT の後、次のコードと差し替えてください。

# 指定した要素を含むHTMLを取得する
my $res = scraper {
  process 'li', 'li[]' => sub {
    my $elem = shift;
    return $elem->as_HTML('<>&', '', {});
  }
}->scrape($html_content);

warn Dumper $res;

ここで、as_HTML メソッドは 3 つの引数をとります。

$h->as_HTML($entities, $indent_char, \%optional_end_tags)

$entities において、HTML エンティティの形式に変換する (例:@→&#64;) 文字を指定します。これを指定しないと、すべての "unsafe characters" が変換の対象になります。特に、日本語の部分が HTML エンティティの形式に変換されて文字化け状態になります。

$indent_char はインデントの指定で、通常はタブ ¥t や空白スペースを指定します。

¥%optional_end_tags の引数を省略すると、p、li、dt、dd の終了タグが省略されます。終了タグを一切省略したくない場合には、空のハッシュリファレンス {} を指定する必要があります。

上のプログラムの実行結果は以下のとおり。

$VAR1 = {
          'li' => [
                    '<li><a href="http://www.gogole.com/">Google</a></li>',
                    '<li><a href="http://www.yahoo.co.jp/">Yahoo! Japan</a></li>',
                    '<li><a href="http://www.bing.com/">Bing</a></li>',
                    '<li><a href="http://www.rakuten.co.jp/">楽天市場</a></li>',
                    '<li><a href="http://www.amazon.co.jp/">Amazon.co.jp</a></li>'
                  ]
        };

指定した要素のテキスト部分を取得する場合

最初のプログラムにおいて、EOT の後、次のコードと差し替えてください。

# 指定した要素のテキスト部分を取得する
my $res = scraper {
  process '#shopping li', 'website[]' => scraper {
    process 'a', 'text' => 'TEXT';
    process 'a', 'url' => '@href';
  };
}->scrape($html_content);

warn Dumper $res;

@属性名で属性の値が取得できます。

上のプログラムの実行結果は以下のとおり。

$VAR1 = {
          'website' => [
                         {
                           'text' => '楽天市場',
                           'url' => 'http://www.rakuten.co.jp/'
                         },
                         {
                           'text' => 'Amazon.co.jp',
                           'url' => 'http://www.amazon.co.jp/'
                         }
                       ]
        };

参考 URL

CPAN - Web::Scraper
Web Scraper Shibuya.pm tech talk #8
CPAN - HTML::Element:as_HTML メソッドについて。

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。