お腹が空いてきたので、モスバーガーのホームページからメニューをスクレイピングしてみる。
別に買いに行く訳じゃないけど...
思った以上に苦戦。苦戦の理由は「HTMLにIDやCLASSが殆んど振られておらず、XPathで抽出出来るパタンがない」こと。しょうがないのでまた無茶ぶりを発揮して、ノード階層をパタンとして使い、最小マッチのノードから欲しいノードへ上昇するというドロ臭いXPathを書いた。
パタンは、td要素を2つ持つtr要素で、かつそのtd要素内にはhref属性に"/menu/"という文字列を含んだa要素、しかもそのa要素は"pdf"という文字列を含んでいない。結果、CSSセレクタは全く使わなかった(使えなかった?)。これじゃ、Web::Scraperのスライド資料の悪い例のままだ...
ま、取れたので良しとしよう。
mosburger-scraper.pl
#!/usr/local/bin/perl
use warnings;
use strict;
use Web::Scraper;
use YAML;
use URI;
my $uri = URI->new("http://www.mos.co.jp/menu/index.html");
my $mosburger = scraper {
process '//tr[count(td)=2]/td/a[contains(@href,"/menu/") and not(contains(@href,".pdf"))]/img/../../..',
'menus[]' => scraper {
process '/tr/td[1]/a', url => sub {URI->new_abs($_->attr('href'), $uri)->as_string;};
process '/tr/td[1]/a/img', title => '@alt';
process '/tr/td[1]/a/img', image => sub {URI->new_abs($_->attr('src'), $uri)->as_string;};
process '/tr/td[2]/a',
'perk' => scraper {
process '.', url => sub {URI->new_abs($_->attr('href'), $uri)->as_string;};
process 'img', title => '@alt';
};
};
result 'menus';
};
my $burgers = $mosburger->scrape($uri);
warn Dump $burgers;
---
- image: http://www.mos.co.jp/menu/img/ph_hamburger18.jpg
perk:
title: サウザン野菜バーガー ¥300
url: http://www.mos.co.jp/menu/hamburger/thousand/
title: サウザン野菜バーガー
url: http://www.mos.co.jp/menu/hamburger/thousand/
- image: http://www.mos.co.jp/menu/img/ph_hamburger19.jpg
perk:
title: [期間限定 10月中旬まで] シーザーサラダバーガー ¥300
url: http://www.mos.co.jp/menu/hamburger/seasar/
title: シーザーサラダバーガー
url: http://www.mos.co.jp/menu/hamburger/seasar/
...
補足情報(場合によってはセットメニュー)も一緒に取得出来ます。あー。はらへった。