HTML::Parserを使ってみる

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$'