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";

 
XPathFirebugで取得して指定してるんだが…
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」の部分を削ってみるとデータが取得できた。
Σ( ̄□ ̄;) FirebugPerlXPathの解釈は違うのか?!
どっちが合ってるのかは私には分かりませんが…*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火
晴れ

*1:エラーは出ない

*2:Firebugの方が合ってる気はするけど…