



HTMLページを解析する
use HTML::parser;
パッケージをロードする。日本語のページを解析する場合は、utf8に変換してから解析すること。
使い方:
use utf8;
binmode STDOUT,":utf8";
my $ps = new HTML::Parser( api_version => 3, handler_name => [ \&handler , "argument , …"] , …);
open (my $fh , "<:utf8", $html_file) || die "file open error\n";
$ps->parse_file($fh);
handler_nameとargumentには、下記のニーモニックを指定する。handler_nameに対応するイベントが発生した時に&handlerがargumentを引数にしてコールされる。
同じ構造のHTMLを繰り返し解析する用途には、HTML::TreeBuilder の方が向いている。
| handler_name | イベント | argument | |||
| tag | tagname | attr | text | ||
| start_document_h | 解析開始時 | undef | undef | undef | undef |
| end_document_h | 解析終了時 | undef | undef | undef | undef |
| declaration_h | DOCTYPEタグ検出時 | !doctype | doctype | undef | タグ全体 |
| start_h | 開始タグ検出時 | タグ 例:html |
タグ 例:html |
タグパラメタを切り出したハッシュへの参照 | タグ全体 |
| end_h | 終了タグ検出時 | タグ 例:/html |
タグ 例:html |
undef | タグ全体 |
| comment_h | コメントタグ検出時 | ゴミ※ | ゴミ※ | undef | タグ全体 |
| text_h | テキスト検出時 | undef | undef | undef | 検出されたテキスト |
| default_h | ハンドラ未定義イベント | 検出イベントに依存 | |||
※コメント文字列をタグとパラメタ風に解釈して渡してくる
上記以外の主なargument
line:イベントが発生した行(先頭行は1)
self:HTML::Parseオブジェクト
skipped_text:前回イベント以降にスキップされたテキスト
使用例:
my $ps = new HTML::Parser(api_version=>3,
start_h => [\&start ,"text,line,tag,tagname,attr"],
end_h => [\&end,"text,line,tag,tagname"]);
binmode STDOUT, ":utf8";
open(my $fh, "<:utf8", "./parse.html");
$ps->parse_file($fh);
sub start {
my $text = shift;
my $line = shift;
my $tag = shift;
my $tagname = shift;
my $attrr = shift;
my %attr = %$attrr;
print "START TAG=$tag TAGNAME=$tagname LINE=$line\n";
print "text=$text\n";
foreach my $key (keys %attr) {
print "$key=$attr{$key}\n";
}
print "---\n";
}
sub end {
my $text = shift;
my $line = shift;
my $tag = shift;
my $tagname = shift;
print "END TAG=$tag TAGNAME=$tagname LINE=$line\n";
print "text=$text\n";
print "---\n";
}