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に有害な最低限のエンティティ文字だけは再エンコードされる(例:> や < など)。