HTMLファイルの <a href="...."> 部分のURLを簡単に抜き出すスクリプト
スクリプトの引数に「ファイル名を指定」してもよいし、パイプ(”<”)で流しこんでもよいし… どちらの方法でも処理可能
#!/usr/bin/perl
use strict;
use warnings;
use HTML::LinkExtor;
my $file = shift || '';
if($file ne '' && !(-f $file)){
print("error: file '".basename($file)."' not found\n");
exit();
}
my $p = HTML::LinkExtor->new(\&callback);
sub callback {
my($tag, %links) = @_;
# <A HREF=...> の場合のみ読み込む
if(lc($tag) eq 'a' && defined($links{'href'}) && length($links{'href'})>0){
print($links{'href'}."\n");
}
}
if($file eq ''){ $p->parse(join('', <>)); } # 標準入力から読み込む
else{ $p->parse_file($file); } # ファイルから読み込む
コールバック関数を、インラインにしたほうが分かりやすいかも知れない。修正部分は次のようになる。
my $p = HTML::LinkExtor->new(
sub { # callback sub (inline)
my($tag, %links) = @_;
# <A HREF=...> の場合のみ読み込む
if(lc($tag) eq 'a' && defined($links{'href'}) && length($links{'href'})>0){
print($links{'href'}."\n");
}
});
さらに、コールバック関数内で表示するのではなく、一旦配列に格納してから表示するようにすることも出来る。(配列の内容を、好きなようにいじれる)
my @arr_extracted;
my $p = HTML::LinkExtor->new(\&callback);
my $p = HTML::LinkExtor->new(
sub { # callback sub (inline)
my($tag, %links) = @_;
# <A HREF=...> の場合のみ読み込む
if(lc($tag) eq 'a' && defined($links{'href'}) && length($links{'href'})>0){
print($links{'href'}."\n");
}
});
if($file eq ''){ $p->parse(join('', <>)); } # 標準入力から読み込む
else{ $p->parse_file($file); } # ファイルから読み込む
foreach my $str (@arr_extracted){
print $str."\n";
}