FirebugのXPathの解釈とPerlのXPathの解釈が違う???
気象庁のwebサイトから予報の内容を取得しようとしてハマった。
天気予報のページからは取得できたので
週間予報のページからの取得もやってみようと思ったら
何故か上手くいかない…何でだ?(;´Д`)
書いてみたコードは↓これ。
#!/usr/local/bin/perl use URI; use Web::Scraper; binmode(STDOUT,":encoding(cp932)"); my $WeatherInfo = scraper { process "/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr/th[2]", day => 'TEXT'; process "/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr[2]/td/img", weather => '@alt'; }; my $res = $WeatherInfo->scrape(URI->new("http://www.jma.go.jp/jp/week/319.html")); print $res->{day}."\n"; print $res->{weather}."\n";
XPathをFirebugで取得して指定してるんだが…
HTMLを見ても合っていそうなのに結果は空白…。*1
暫くパスをいじっているうちに原因が判明。
Firebugで取得したXPathは
/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr/th[2]
HTMLの通りだ。
しかし。
/html/body/div[2]/div[2]/div[5]/p/table/tr/th[2]
「tbody」の部分を削ってみるとデータが取得できた。
Σ( ̄□ ̄;) FirebugとPerlのXPathの解釈は違うのか?!
どっちが合ってるのかは私には分かりませんが…*2
さらに驚いたのは
/html/body/div[2]/div[2]/div[5]/p/table/tbody/tr[2]/td/img
↑こっち。
/html/body/div[2]/div[2]/div[5]/p/table/tr[2]/td/img
直したのに表示されたデータは空白。
「tbody」を削ってもデータを取得できないのだ。
原因は「tr[2]」の部分。
/html/body/div[2]/div[2]/div[5]/p/table/tr[3]/td/img
添え字の2を3に直したらデータを取得できた。
見た目でもHTMLでも2で合っている筈なのに。
原因は
tr[1]とtr[2]の間にあるformタグ。
tr[2]で取得できるはずのデータはtr[3]の扱いになり
tr[2]と指定して取得されるのはformタグの中身ということになる。
formタグの下は何もないので取得データは空白となる。
これはひどい(>_<)
最終的にコードは↓になりました。
#!/usr/local/bin/perl use URI; use Web::Scraper; binmode(STDOUT,":encoding(cp932)"); my $WeatherInfo = scraper { process "/html/body/div[2]/div[2]/div[5]/p/table/tr/th[2]", day => 'TEXT'; process "/html/body/div[2]/div[2]/div[5]/p/table/tr[3]/td/img", weather => '@alt'; }; my $res = $WeatherInfo->scrape(URI->new("http://www.jma.go.jp/jp/week/319.html")); print $res->{day}."\n"; print $res->{weather}."\n";
実行結果。
27火 晴れ