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. & → 全角&
  2. & → &

という順番で変換すれば良さそうです。

1.はこんな感じでいけます

$content=~ s/&/&/g;

 

が文字コードを使って書くとこうなります。

$content=~ s/&/\xef\xbc\x86/g;

Unicode対応 文字コード表

 

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;

これでやっと文字化け無く取得できるようになりました。