HTML::TreeBuilderでHTMLの解析をするモダンなPerlスクリプト

2010年6月 7日
| コメント(0) | トラックバック(1) HTML::TreeBuilderでHTMLの解析をするモダンなPerlスクリプト

簡単!たった13行のコードでHTML取得&解析をするPerlスクリプト - DQNEO起業日記」が面白そうだったので、コードをコピペしたけど、文字化けしたので、Windowsでも動くように書き直してみた。

…かなり行数は増えましたが。

# utf8
# インスパイヤ:[Perl]簡単!たった13行のコードでHTML取得&解析をする - DQNEO起業日記 <http://dqn.sakusakutto.jp/2010/06/perlhtml.html>
use 5.8.1;
use strict;
use warnings;
use utf8;
 
use Term::Encoding qw(term_encoding);
my $encoding = term_encoding;
 
binmode STDOUT => ":encoding($encoding)";
 
use LWP::UserAgent;
use HTML::TreeBuilder;
 
# urlを指定する
my $url = 'http://yahoo.jp';
 
# IE8のフリをする
my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
 
# LWPを使ってサイトにアクセスし、HTMLの内容を取得する
my $ua = LWP::UserAgent->new(agent => $user_agent);
my $res = $ua->get($url);
my $content = $res->decoded_content;
 
# HTML::TreeBuilderで解析する
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);
 
# DOM操作してトピックの部分だけ抜き出す。
# <div id='topicsfb'><ul><li>....の部分を抽出する
my @items =  $tree->look_down('id', 'topicsfb')->find('li');
 
print $_->as_text."\n" for @items;

文字化けしないようにするには、以下の三つが大事です。

  • スクリプトをutf8で書いて、「use utf8」する
  • 入口でdecodeする
  • 出口でencodeする

まずはutf8で書いて「use utf8」します。

で、次は入り口でdecodeです。
今の場合、ウェブから取ってきたページをdecodeしてやる必要があります。
それをするには「$res->content」としているところを、「decoded_content」にします。
ただし、「decoded_content」しても文字化けする可能性はあるので、その時は別途対策が必要になります。
とりあえず、Yahooのトップページはうまく行くので、そのままにしておきます。
ということで、$contentには、decodeされてPerlの内部形式になったYahooのトップページが保管されています。

出口のencodeについては、binmodeで宣言しているので、print時に自動的にencodeされます。

と、そんな感じに修正すると、文字化けなく表示されるようになりました。

菅新首相の支持率62.4% NNN写真
エース級種牛、生き残り容認へ写真
回転ずし店に車 14人が重軽傷写真
茨城・上海チャーター便就航へ写真
「イカロス」帆の展開8日以降に写真
他チーム故障 ブラジルは複雑写真
全仏男子 ナダル5度目の優勝NEW
古瀬アナが絵本作家デビュー写真
昨日の話題(42件)
一覧

トラックバック(1)

このブログ記事に対するトラックバックURL:

このブログ記事を参照しているブログ一覧:

さっきの記事を書きながら、トピックスの取得だったらRSSで良いよね、と思ってしま... 続きを読む

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2010年6月 7日 02:48に書いたブログ記事です。

ひとつ前のブログ記事は「モダンPerl#32でTerm::Encodingを知った」です。

次のブログ記事は「Yahooのトピックスを取得する他の手段」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type