HTTP::Messageのソースコードを読んでるときに, HTML::Parserが使われて
いたので perldocを読んでサンプルコードを書いてみた。
イベントドリブンなツールなんで毛嫌いしていたところもありますけど、
そんなに難しくなかった。ただコンストラクタが若干あれかな。
イベントハンドラに関するパラメータが配列リファレンスで一つ目の
要素がコールバック関数で, 2番目の引数がコールバック関数の引数の
指定。キーと値で設定でも良いような気もしますが、まあこういうモジュール
ということで使いましょう。
以下はコマンドライン引数で指定した urlとパターンからマッチするリンクを
抽出するものです。
#!/usr/bin/perl use strict; use warnings; use LWP::Simple; use HTML::Parser; die "usage ./html_parser url pattern\n" if scalar @ARGV < 2; my $url = shift @ARGV; my $tmp = shift @ARGV; my $regexp = qr/$tmp/; my @matches; my $parser = HTML::Parser->new( start_h => [ sub { my ($self, $attr) = @_; return unless defined $attr->{'href'}; return unless $attr->{'href'} =~ m/$regexp/; push @matches, $attr->{'href'}; }, "self, attr" ], report_tags => [ qw(a) ] ); $parser->parse( get $url ); print $_, "\n" for @matches;
使い方例
% perl html_parser.pl http://example.com '\.png$'