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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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されます。
と、そんな感じに修正すると、文字化けなく表示されるようになりました。

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