试图在xpath读取值

时间:2011-10-11 20:31:13

标签: html xml perl xpath

我正试图获得本网站上列出的学区价值:http://gis.nyc.gov/dcp/at/f1.jsp?submit=true&house_nbr=310&street_name=Lenox+Avenue&boro=1

我使用Firebug来获取该值的XPath: / HTML /体/表/ tbody的/ TR [2] / TD /表/ tbody的/ TR / TD [2] /表/ tbody的/ TR / TD /表/ tbody的/ TR [3] / TD /表/ TBODY / TR [2] / TD [2] /表/ tbody的/ TR [2] / TD /表/ tbody的/ TR [10] / TD [2]

并希望用Perl阅读它。我写了以下代码:

#!/usr/bin/perl -w

use HTML::TreeBuilder::XPath;
use Data::Dumper;

my $tree= HTML::TreeBuilder::XPath->new;

$tree->parse_file("test.html");

my @nb=$tree->findvalue( '/html/body/table/tbody/tr[2]/td/table/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/table/tbody/tr[10]/td[2]');

print Dumper(@nb);

但它只返回$VAR1 = '';

任何建议。为了让它运行,我只是将源代码从网页复制到test.html。

谢谢!

1 个答案:

答案 0 :(得分:3)

某些HTML元素(HTML,HEAD,BODY和TBODY)的开始标记是可选的。看看

...<table><tr><td>Foo</td></tr></table>...

根据HTML,该片段代表四个元素:

TABLE
   TBODY
      TR
         TD

Firefox会创建所有四个元素,因此它为TD元素提供以下xpath:

.../table/tbody/tr/td

HTML :: TreeBuilder可能在省略其开始标记时不创建元素,因此它只为该片段创建三个元素:

TABLE
   TR
      TD

您需要使用以下xpath来定位TD元素:

.../table/tr/td

我敢打赌,如果你从xpath中删除tbody测试,你会找到结果,因为TBODY元素很可能在文件中找不到。