Web::ScraperでFaviconのURL抽出

typesterさんのWWW::Faviconというモジュールを使おうとしたんだけど、諸々の事情でWeb::Scraperを使うことになったので抽出ロジックをごっそり頂戴してみた。

use strict;
use warnings;

use LWP::UserAgent;
use Web::Scraper;

my $url = 'http://example.com';

my $ua = LWP::UserAgent->new;
my $res = $ua->get($url);

my $scraper = scraper {
    process '//link[@rel =~ /^(?i)(shortcut )?icon$/]', 'favicon' => '@href';
};

my $item = $scraper->scrape( $res->content, $res->base );
unless ( $item->{favicon} ) {
    my $base = $res->base->clone;
    $base->path('/favicon.ico');
    $item->{favicon} = $base;
}

warn $item->{favicon};


ロジック的には


XML::XPathEngineがXPath拡張をしていて正規表現に対応できるのを知らんかった。

追記: 間違えたので直した