HTML::TreeBuilderでの文字化け対策
サンプルを作り特殊文字を含めてみて検証を行いました。
そのままでテキストデータを取得します。
テストページ これはテストコンテンツです。 テストとは、英語のtestのカタカナ表記です。 試験、試す、 という意味です。 画像を表示できます。
このように取得できます。
前回の検証結果から、「’」を含めて試してみます。
a??a?1a??a??a??a?, a??a??a? ̄a??a?1a??a?3a?3a??a?3a??a?§a??a? a??a?1a??a?¨a? ̄a?e?±ea?a?Rtesta?Ra?≪a??a?≪a??e!¨e¨?a?§a??a? ec|e¨?a?ec|a??a?a?¨a??a??a??a?3a?§a??a? c?≫a??a??e!¨c?oa?§a??a??a??a?
見事に化けました。
他のコードは?
こちらを参考にしました。
矢印 & 矢印に使える記号、使えそうな記号
試してみたところ・・・
ほとんどNG
というか
全部NGでした。
以下は大丈夫のようでした。
- &
- >
- <
-
対策は?
&を&に変換してしまえばいいか?と考えました。
ところが、&を使った語句がありそうな気がします。
・トム&ジェリー
・タイガー&ドラゴン
ふ・・・古い・・・ちょっと他に思いつきませんでした^^;
ということで
- & → 全角&
- & → &
という順番で変換すれば良さそうです。
1.はこんな感じでいけます
$content=~ s/&/&/g;
が文字コードを使って書くとこうなります。
$content=~ s/&/\xef\xbc\x86/g;
2.はこうです。
$content=~ s/&/&/g;
組み込むと以下のようになります。
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTML::TreeBuilder;
use Jcode;
# urlを指定する
my $url = 'http://retrip.jp/articles/5381/';
# 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->content;
# 文字コードを調べる
my $code = Jcode::getcode($content);
if ( $code ne 'utf8' ){
$content = Jcode::convert( $res->content ,'utf8' , $code);
}
# 特殊文字を変換する.
$content=~ s/&/\xef\xbc\x86/g;
$content=~ s/&/&/g;
# HTML::TreeBuilderで解析
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);
# DOM操作
my @items = $tree->find('html');
print $_->as_text."\n" for @items;
これでやっと文字化け無く取得できるようになりました。
ディスカッション
コメント一覧
まだ、コメントがありません