by Hippo2000(2001/1/25)
HTML::TokeParserなのです。
なお内容等が間違っていたら修正します。ご連絡ください。
変更履歴
2002/4/24 古谷俊一さんの指摘を受けてnewの引数の間違いを修正。
HTML::TokeParser - 代替 HTML::Parser インターフェース
require HTML::TokeParser;
$p = HTML::TokeParser->new("index.html") || die "Can't open: $!";
while (my $token = $p->get_token) {
#...
}
HTML::TokeParser はHTML::Parserクラスへの代替のインターフェースです。これは基本的にHTML::Parserを内側と外側にひっくり返します。パーサーにファイル(もしくはIO::Handleオブジェクトや文字列)を構築する時点で関連付け、繰り返し、解析されたドキュメントで見つかったタグとテキストを取得するために$parser->get_tokenを繰り返し呼びます。
HTML::Parser基本クラスにより定義された関数を呼び出すことはおかしくなるのでやめてください。代わりに以下のメソッドを使ってください:
もし引数が単なるスカラであれば、オープンされ解析されるファイル名として取られます。もしそのファイルを読み込みでオープンできなければ、コンストラクは未定義値を返し、$!はなぜ失敗したかを教えてくれます。
もし引数が単なるスカラへのリファレンスであれば、このスカラは解析するドキュメントのリテラルだと取られます。このスカラの値はすべてのトークンが取り出される前に変更されるべきではありません。
そうでなければ、引数はHTML::TokenParserがさらなるデータが必要なときにread()することができるなんらかのオブジェクトだと取られます。典型的にはある種のファイルハンドルになります。ストリームはEOFになるまでread()されますが、クローズされません。
["S", $tag, $attr, $attrseq, $text] ["E", $tag, $text] ["T", $text, $is_data] ["C", $text] ["D", $text] ["PI", $token0, $text]
$attrはハッシュ・リファレンス、$attrseqは配列リファレンス、そして残りは単なるスカラです。
$p->get_tag("font", "/font");
はfont要素の次の開始または終了タグを探します。
タグ情報は上記の $p->get_tokenと同じ形で配列リファレンストとして返されます。しかしタイプ・コード(最初の要素)はありません。開始タグは以下のように返されます:
[$tag, $attr, $attrseq, $text]
終了タグのタグ名には"/"がつきます。つまり終了タグは以下のように返されます:
["/$tag", $text]
$p->{textify}属性はハッシュであるタグをどのようにテキストとして扱われるかを定義します。もし開始タグ名がこのハッシュのキーにマッチしたら、このタグはテキストに変換されます。ハッシュの値はどのタグ属性からテキストを取り出すかを指定するために使われます。このタグ属性がなければ、大文字にされたタグが括弧に囲まれて返されます。例えば"[IMG]"といった具合です。ハッシュ値はサブルーチン・リファレンスにすることもできます。この場合、開始タグで呼び出されるルーチンは引数として内容をとり、戻り値はテキストとして扱われます。
デフォルトの$p->{textify} の値は以下の通りです:
{img => "alt", applet => "alt"}
つまり<IMG>と<APPLET>タグはテキストとして扱われ、そのテキストはALT属性で見つかったものに変換されます。
この例はドキュメントからすべてのリンクを取り出します。これは各リンク、含まれるURL、そして<A>..</A>タグの間のテキストによる記述を1行で出力します。
use HTML::TokeParser; $p = HTML::TokeParser->new(shift||"index.html");
while (my $token = $p->get_tag("a")) {
my $url = $token->[1]{href} || "-";
my $text = $p->get_trimmed_text("/a");
print "$url\t$text\n";
}
この例はドキュメントから<TITLE>を取り出します:
use HTML::TokeParser;
$p = HTML::TokeParser->new(shift||"index.html");
if ($p->get_tag("title")) {
my $title = $p->get_trimmed_text;
print "Title: $title\n";
}
Copyright 1998-2000 Gisle Aas.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。