忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/03    02« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  »04

HTML::Parser について

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

HTML::Parser について

HTML::Parser について使い方がなかなか分からなかったので書いておく。

挙動の特徴

parser を提議させ、その parser の parse 関数を実行すると parse 関数に渡した html を解析してくれる。

一気に解析して木を作ってくれるわけではない。HTML を上から順番に見ていき、開始タグ、終了タグ、なんでもない文章、コメントといったものを1つ1つ見つけるごとに関数を実行する、という挙動をする。そのため、parser を定義するときは「〇〇を見つけたらこの関数を実行してね」という話をする。

event

上述の 開始タグ、終了タグ、なんでもない文章、コメントといったもの を event と呼んでいる(一覧)。この各イベントに対して見つかった際に実行する関数(handler)を定義することで parser を定義するのである。後述の例は イベント名_h というのがやたら出てくるが「〇〇というイベントに対応する handler」を定義しているのである。例えば開始タグのイベントに対しては when_open_tag_found という関数を handler として割り当てている([\&when_open_tag_found, "self, tagname, attr"])。

handler に渡す引数

色々渡せる(一覧)。後述の例では 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";
}
PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R