[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
HTML::Parser について使い方がなかなか分からなかったので書いておく。
parser
を提議させ、その parser の parse
関数を実行すると parse 関数に渡した html を解析してくれる。
一気に解析して木を作ってくれるわけではない。HTML を上から順番に見ていき、開始タグ、終了タグ、なんでもない文章、コメントといったものを1つ1つ見つけるごとに関数を実行する、という挙動をする。そのため、parser を定義するときは「〇〇を見つけたらこの関数を実行してね」という話をする。
上述の 開始タグ、終了タグ、なんでもない文章、コメントといったもの
を event と呼んでいる(一覧)。この各イベントに対して見つかった際に実行する関数(handler
)を定義することで parser を定義するのである。後述の例は イベント名_h
というのがやたら出てくるが「〇〇というイベントに対応する handler」を定義しているのである。例えば開始タグのイベントに対しては when_open_tag_found
という関数を handler として割り当てている([\&when_open_tag_found
, "self, tagname, attr"])。
色々渡せる(一覧)。後述の例では start には tag 名称とその要素に当てられた属性を handler に渡している([\&when_open_tag_found, "self, tagname, attr"]
)
use HTML::Parser (); use LWP::UserAgent; print "start\n"; my $browser = LWP::UserAgent->new; my $response = $browser->get("http://shunshun94.example.com/index.html"); my $parser = HTML::Parser->new( api_version => 3, start_h => [\&when_open_tag_found, "self, tagname, attr"], end_h => [\&when_close_tag_found, "self, tagname"], text_h => [\&when_text_found, "self, text"], comment_h => [\&when_comment_found, "self, text"] ); $parser->parse($response->content); print "finish!\n"; sub when_open_tag_found { my ($self, $tagname, $attr) = @_; print "OPEN $tagname\n"; } sub when_close_tag_found { my ($self, $tagname) = @_; print "CLOSE $tagname\n"; } sub when_text_found { my ($self, $text) = @_; print "TEXT $text\n"; } sub when_comment_found { my ($self, $text) = @_; print "COMMENT $text"; }
ただいまコメントを受けつけておりません。