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};
ロジック的には
- rel属性はcase sensitiveに対応
- faviconへのリンクがなかったら/favicon.icoにフォールバック
XML::XPathEngineがXPath拡張をしていて正規表現に対応できるのを知らんかった。
追記: 間違えたので直した