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