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. çµæ -> 常ç¿è€Eµã¤ãE2007N09ã®è¨äºE/h2> 2007N0928ú ã»ã¹ ... 結果 -> 結果 -> 結果 -> 結果 -> japan Wide character in print at perl/google_search2.pl line 26. çµæ -> ããããã㸠ãã­ã°ã©ãã³ã° Å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'));
ってやってリンク遷移してくれました。