11 September 2011

(Perl) pQueryでutf8とsjisのhtmlファイルを読み込む

tableタグ内の抜き出しなどで使われる pQuery クラス。Perlスクリプトの規定文字コード以外のファイルの読み込み方などのメモ

たとえば、tableのtdタグ内の文字列だけを取り出すスクリプトを書いてみると、次のようになる。


#!/usr/bin/perl

use strict;
use warnings;
use utf8; # プログラム規定文字コード
use pQuery;
use HTML::Scrubber;
use Encode;

binmode(STDOUT, ":utf8"); # 画面出力の規定文字コード

my $scrubber = HTML::Scrubber->new();
$scrubber->allow(qw[ br ]); # <br> タグは通過させる

my $str_buf = ''; # 入力ファイルの内容
my $str_out = ''; # 出力ファイルの内容

if(open(IN, '< test_enc.html')){
$str_buf = join("\n", <IN>);
close(IN);
}

# utf8に変換した上でutf8フラグを落とす
$str_buf = Encode::decode('utf8', $str_buf); # 入力ファイルがutf8の場合
#$str_buf = Encode::decode('shiftjis', $str_buf); # 入力ファイルがsjisの場合


#pQuery('test.html')->find("tr")->each( sub{
pQuery($str_buf)->find("tr")->each( sub{
pQuery($_)->find("td")->each( sub{
my $str = $scrubber->scrub($_->innerHTML());
print($str."\n"); # 処理中の状況を画面出力
$str_out .= ($str . "\n");
});
});

#$str_out = Encode::decode('shiftjis', $str_out);

if(open(OUT, '> test.out.txt')){
binmode(OUT, ":utf8"); # 出力ファイルはutf8エンコード
print(OUT $str_out);
close(OUT);
}

pQueryはエンコードされているエンティティ文字(例:&quot; など)を、勝手にデコードするようだ。HTML::Scrubber->scrub関数を通すことで、HTMLに有害な最低限のエンティティ文字だけは再エンコードされる(例:> や < など)。