HTML::TokeParser version 2.20

by Hippo2000(2001/1/25)

HTML::TokeParserなのです。

なお内容等が間違っていたら修正します。ご連絡ください。

変更履歴


目次


名前

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基本クラスにより定義された関数を呼び出すことはおかしくなるのでやめてください。代わりに以下のメソッドを使ってください:

$p = HTML::TokeParser->new( $file_or_doc );
オウブジェクト・コンストラクタの引数は解析されるファイル名、ファイル・ハンドル・オブジェクトまたは完全なドキュメントになります。

もし引数が単なるスカラであれば、オープンされ解析されるファイル名として取られます。もしそのファイルを読み込みでオープンできなければ、コンストラクは未定義値を返し、$!はなぜ失敗したかを教えてくれます。

もし引数が単なるスカラへのリファレンスであれば、このスカラは解析するドキュメントのリテラルだと取られます。このスカラの値はすべてのトークンが取り出される前に変更されるべきではありません。

そうでなければ、引数はHTML::TokenParserがさらなるデータが必要なときにread()することができるなんらかのオブジェクトだと取られます。典型的にはある種のファイルハンドルになります。ストリームはEOFになるまでread()されますが、クローズされません。

 
$p->get_token
このメソッドはHTMLドキュメントで見つかった次のトークンもしくはドキュメントの終わりではundefを返します。トークンは配列リファレンスで返されます。配列の最初の要素は(大抵)1文字の文字列で、このトークンのタイプを示します。"S"は開始タグ、"E"は終了タグ、"T"はテキスト、"C"はコメント、"D"は宣言、"PI"は処理命令です。残りの引数は対応するHTML::Parser v2 互換コールバックに渡される引数と同じです。(HTML::Parserをご覧ください)。まとめると返されるトークンはこのようになります:
  ["S",  $tag, $attr, $attrseq, $text]
  ["E",  $tag, $text]
  ["T",  $text, $is_data]
  ["C",  $text]
  ["D",  $text]
  ["PI", $token0, $text]

$attrはハッシュ・リファレンス、$attrseqは配列リファレンス、そして残りは単なるスカラです。

$p->unget_token($token,...)
多くのトークンを読みすぎたとわかったならば、次のときに$p->gettokeが呼ばれたときに返されるように、それらを押し戻すことができます。
 
$p->get_tag( [$tag, ...] )
このメソッドは次の開始または終了タグを(他のトークンを飛ばして)、もしくはもしドキュメントにタグがもうなければundefを返します。もし1つまたは複数の引数が与えられると、指定されたタグタイプが見つかるまでトークンを飛ばします。例えば
   $p->get_tag("font", "/font");

はfont要素の次の開始または終了タグを探します。

タグ情報は上記の $p->get_tokenと同じ形で配列リファレンストとして返されます。しかしタイプ・コード(最初の要素)はありません。開始タグは以下のように返されます:

  [$tag, $attr, $attrseq, $text]

終了タグのタグ名には"/"がつきます。つまり終了タグは以下のように返されます:

  ["/$tag", $text]
$p->get_text( [$endtag] )
このメソッドは現在の位置で見つかったすべてのテキストを返します。次のトークンがテキストでなければ、長さ0の文字列を返します。オプションの$endtag引数は指定したタグのまえにあるすべてのテキストを返すように指定します。すべてのエンティティは対応する文字に置換えられます。

$p->{textify}属性はハッシュであるタグをどのようにテキストとして扱われるかを定義します。もし開始タグ名がこのハッシュのキーにマッチしたら、このタグはテキストに変換されます。ハッシュの値はどのタグ属性からテキストを取り出すかを指定するために使われます。このタグ属性がなければ、大文字にされたタグが括弧に囲まれて返されます。例えば"[IMG]"といった具合です。ハッシュ値はサブルーチン・リファレンスにすることもできます。この場合、開始タグで呼び出されるルーチンは引数として内容をとり、戻り値はテキストとして扱われます。

デフォルトの$p->{textify} の値は以下の通りです:

  {img => "alt", applet => "alt"}

つまり<IMG>と<APPLET>タグはテキストとして扱われ、そのテキストはALT属性で見つかったものに変換されます。

$p->get_trimmed_text( [$endtag] )
上記$p->get_textと同じ。ただし空白文字の並びは1つの空白に縮められます。先頭と末尾の空白は削除されます。
 

この例はドキュメントからすべてのリンクを取り出します。これは各リンク、含まれる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";
  }

参考資料

HTML::Parser


著作権(COPYRIGHT)

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.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。