WWW::Mechanize 文字化けにはまる。

やりたいことはとっても簡単なことで、googleで検索して結果を取得・表示させるだけ。
なのに文字化けしてすごい躓いたよ。。。
Mech使ってやって見ました。

use WWW::Mechanize;

my $mech = WWW::Mechanize->new;
my $url = 'http://www.google.co.jp';

$mech->get( $url );
$mech->success or die $mech->response->status_line;

$mech->submit_form(
    fields      => {
        q => 'ヤングジャンプ',
    }   
);

my @links = $mech->find_all_links(
    class => 'l' ,
);

my @texts = map { $_->text } @links;

foreach my $text ( @texts ){
    print "結果 -> ".$text."\n";
}

やりたいことは、
googleのページで検索窓に「ヤングジャンプ」って入力して検索。
結果ページのテキスト10件を取得して、結果->○○〜って表示したいだけ。
なのに・・・。

結果 -> リングジョイン
果 -> フ  ッEゃP亃RヂッVビッド
結果 -> EC  / アンパン 
結果 -> キーワーチE/h1> トッチE></a><img src= キーワード ..
Wide character in print at perl/google_search2.pl line 26.
ç&#181;æ -> 常ç¿è&#8364;E&#181;ã¤ãE2007N09ã®è¨äºE/h2> 2007N0928ú ã&#187;ã&#185; ...
結果 -> 
結果 ->  
結果 -> 
結果 -> japan
Wide character in print at perl/google_search2.pl line 26.
ç&#181;æ -> ããã&#63728;ãã㸠ãã&#173;ã°ã©ãã&#179;ã° ÅWebõ ±±ëÌWeb.com

ボロボロだょ。

ここで結構悩んだんですが、結果として一行追加・設定してあげたら
ぼくが望む挙動になりました。

$mech->agent_alias( $alias )でエージェントを設定してあげてください。

use strict;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new;
$mech->agent_alias( 'Windows Mozilla' ); ##←ここね。
my $url = 'http://www.google.co.jp';

$mech->get( $url );
$mech->success or die $mech->response->status_line;

$mech->submit_form(
    fields      => {
        q => 'ヤングジャンプ',
    }   
);

my @links = $mech->find_all_links(
    class => 'l' ,
);

my @texts = map { $_->text } @links;

foreach my $text ( @texts ){
    print "結果 -> ".$text."\n";
}

で結果。

結果 -> 集英社 週刊ヤングジャンプ公式サイト - Web YOUNG JUMP
結果 -> 週刊ヤングジャンプ - Wikipedia
結果 -> Netマガジン ビジュアル・ヤングジャンプ 〜 佐々木希 セイコレ ...
結果 -> 「週刊モーニング」と「週刊ヤングジャンプ」の表紙に異例の「事件 ...
結果 -> ヤングジャンプ
結果 -> ビジュアル・ヤングジャンプ リア・ディゾン - リアルガイド
結果 -> ヤングジャンプとは - はてなダイアリー
結果 -> 集英社s-manga.net YJ
結果 -> 「ローゼンメイデン」がヤングジャンプで突然復活、連載再開か - GIGAZINE
結果 -> Amazon.co.jp: ヤングジャンプ 2008年 7/3号 [雑誌]: 本

良かった。上手くいった。
こういうのは自分の覚書として残して行いと・・。

んで追記

上のときはたまたまページの文字コードがutf8だったから上手くいっただけで、根本的な解決にはなってなかった・・。
スクリプトとページの文字コードが違う状態でなんかするときはJcodeとか使ってあげて対応しました。
ぼくがはまったのはページがeuc-jpだったため、$mech->follow_linkがリンクを追跡してくれなかったんです。

$mech->follow_link( text => '次のページ');

だと、リンクを見つけてくれないのでundefを返してきます。
なんで、

$mech->follow_link( text => Jcode::convert('次のページ', 'euc-jp'));

ってやってリンク遷移してくれました。