HTML::LinkExtor version 1.29

by Hippo2000(2001/1/25)

HTML::LinkExtorなのです。

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


目次


名前

HTML::LinkExtor - HTMLドキュメントからリンクを取り出す


概要

 require HTML::LinkExtor;
 $p = HTML::LinkExtor->new(\&cb, "http://www.sn.no/";);
 sub cb {
     my($tag, %links) = @_;
     print "$tag @{[%links]}\n";
 }
 $p->parse_file("index.html");

説明

HTML::LinkExtor はHTMLドキュメントからリンクを取り出すHTMLパーサーです。 HTML::LinkExtorHTML::Parserのサブクラスです。つまり$p->parse() または $p->parse_file()メソッドを呼び出すことによりパーサーにドキュメントを与えなければなりません。

$p = HTML::LinkExtor->new([$callback[, $base]])
コンストラクタは2つのオプションの引数をとります。最初はコールバック・ルーチンへのリファレンスです。それはリンクが見つかると呼び出されます。もしコールバックが与えられなければ、リンクは単に内部的に蓄積され、 $p->links() メソッドを呼ぶことにより取り出すことができます。

見つかったURLを絶対化するために使われる$base引数はオプションのbase URLです。もし$baseを与えたいのであれば、URIモジュールをインストールしておく必要があります。

 
コールバックは最初の引数として小文字のタグ名で呼び出され、そしてすべてのリンク属性は分割されたキー/値の組で渡されます。すべての非リンク属性は削除されます。
 
$p->links
ドキュメントで見つかったすべてのリンクのリストを返します。返される値は以下の要素を持った無名配列です。
  [$tag, $attr => $url1, $attr2 => $url2,...]

$p->links メソッドは内部のリンクリストを切り捨てもします。つまりもし途中で解析することなくメソッドが2度呼ばれると、2番目の呼出しは空リストを返します。

またHTML::LinkExtor が作成されたときに、コールバック・ルーチンが与えられれば、$p->linksは常に空を返します。


LWPを使って受け取られたドキュメントからリンクをどのように取り出すことができるかということを示す例です。

  use LWP::UserAgent;
  use HTML::LinkExtor;
  use URI::URL;
  $url = "http://www.sn.no/";;  # 例
  $ua = new LWP::UserAgent;
  # イメージ・リンクを集めるようにコールバックを設定
  my @imgs = ();
  sub callback {
     my($tag, %attr) = @_;
     return if $tag ne 'img';  # we only look closer at <img ...>
     push(@imgs, values %attr);
  }
  # パーサーを作成。残念ながらまだbaseを知りません。
  # (it might be diffent from $url)
  $p = HTML::LinkExtor->new(\&callback);
  # ドキュメントを要求し、届いたら解析します
  $res = $ua->request(HTTP::Request->;new(GET => $url),
                      sub {$p->parse($_[0])});
  # すべての image URLを絶対に展開する
  my $base = $res->base;
  @imgs = map { $_ = url($_, $base)->abs; } @imgs;
  # それを出力する
  print join("\n", @imgs), "\n";

参考資料

HTML::Parser, HTML::Tagset, LWP, URI::URL


著作権(COPYRIGHT)

(原文のまま)

Copyright 1996-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)にお願いします。