すっかり出遅れた(というか忘れていた)Monday Module HTML::LinkExtorの巻ですが、あまりぱっとしたものが思いつかなかったので、このモジュールの機能をコマンドラインから便利に使いましょうというネタで。
んーっとMonday Moduleのネタはnaoyaさんちあたりを参照してください。私のは指定したURLのリンクを抜き出して、列挙するだけのスクリプトです。面白くも何ともありませんね。% extlink http://module.jp/ | head http://module.jp/ http://module.jp/ http://module.jp/book/ http://module.jp/cookbook/apache_api/ http://module.jp/blog/ http://module.jp/about.html http://module.jp/index.rdf http://module.jp/book/ mailto:oyama@module.jp http://www.gihyo.co.jp/なので、取り出すタグとその属性を指定できるようにしています。
$ extlink -t=img -a=src http://module.jp/blog/gaap-wind.html http://module.jp/image/gaap-2003051801.pv.jpg http://module.jp/image/gaap-2003051802.pv.jpg http://module.jp/image/gaap-2003051803.pv.jpg http://module.jp/image/gaap-2003051804.pv.jpg http://module.jp/image/gaap-2003051805.pv.jpg http://module.jp/image/gaap-2003051806.pv.jpg http://module.jp/image/gaap-2003051807.pv.jpg http://module.jp/image/gaap-2003051808.pv.jpg http://module.jp/image/gaap-2003051809.pv.jpg http://module.jp/image/gaap-2003051810.pv.jpg http://module.jp/image/panda_book.jpgこの場合imgタグのsrc属性を取り出しなさい、という指定です。grepやuniqやsortを組み合わせると、Webサイトのメンテナンスやクロールに何か役立つかもしれません。っつーかこういう用途にHTML::LinkExtorを使うと、ハイパーリンク要素しか取り出せないので汎用性が落ちてしまいます。そのため本来はHTML::Parserを素直に使った方がより汎用的ですね。
#!/usr/bin/perl -s
use LWP::Simple;
use HTML::LinkExtor;
use strict;
our $h; # option show usage
our $t; # option tag
our $a; # option attr
my $url = shift;
exit show_usage() if $h || !$url;
$t ||= 'a';
$a ||= 'href';
my $parser = HTML::LinkExtor->new(sub {
my ($tag, 0nk) = @_;
return unless $tag =~ /^$t$/i;
return unless exists $link{$a};
print $link{$a}, "\n";
}, $url);
my $html = get($url)
or die "$0: cannot connect url: $url\n";
$parser->parse($html);
exit 0;
sub show_usage {
warn <<__USAGE__;
Usage: $0 [h] [-t tag] [-a attr] http://example.jp/
__USAGE__
return 1;
}
__END__
=head1 NAME
extlink - Extract links from an HTML document
=head1 SYNOPSIS
$ extlink http://example.jp/
$ extlink -t=img -a=src http://img.example.jp/
$ extlink http://directory.example.jp/ | grep ^mailto: > to_spam.txt
=cut
昔このモジュールでWebサイトの改ざん監視ツールを洒落でかいて、なぜかサーバ監視で利用されてしまっていたりしましたが、あのネタもいい加減マンネリなので。