2014-09-13 149 views
2

我无法通过其ID获取节点。代码很简单,应该是自我解释。Xpath将无法识别ID

#!/usr/bin/perl 
use Encode; 
use utf8; 
use LWP::UserAgent; 
use URI::URL; 
use Data::Dumper; 
use HTML::TreeBuilder::XPath; 

my $url = 'https://www.airbnb.com/rooms/1976460'; 
my $browser = LWP::UserAgent->new; 
my $resp = $browser->get($url, 'User-Agent' => 'Mozilla\/5.0'); 

if ($resp->is_success) { 
    my $base = $resp->base || ''; 
    print "-> base URL: $base\n"; 
    my $data = $resp->decoded_content; 

    my $tree= HTML::TreeBuilder::XPath->new; 
    $tree->parse_content($resp->decoded_content()); 
    binmode STDOUT, ":encoding(UTF-8)"; 
    my $price_day = $tree->find('.//*[@id="price_amount"]/'); 
    print Dumper($price_day); 

    $tree->delete(); 
} 

上面打印的代码:

-> base URL: https://www.airbnb.com/rooms/1976460 
$VAR1 = undef; 

如何选择其ID的节点?

在此先感谢。

+4

Offtopic,但'perl -Mojo -E'说g(“https://www.airbnb.com/rooms/1976460”) - > dom-> find(q {div [id =“price_amount”] }) - > text''打印$ 285'。 Mojo :: DOM是一个很好的模块... – jm666 2014-09-13 16:34:17

+0

感谢您的提示!我进一步研究了Mojo,并且喜欢它使用CSS选择器代替XPath – 3und80 2014-09-16 06:20:38

回答

2

将那个/关闭在该XPath的结尾处。

.//*[@id="price_amount"] 

应该做的。事实上,它不是有效的XPath。

+1

,这很奇怪。使用perl v5.10它不起作用。但与Perl V5.18.2它是.. 也许这有助于他人^^ – 3und80 2014-09-16 06:19:28

0

。在你的XPath尾随斜线,你需要删除

my $price_day = $tree->find('.//*[@id="price_amount"]'); 

然而,从我自己的测试,相信HTML::TreeBuilder::XPath也有麻烦解析特定URL。也许是因为有条件的评论?

作为一种替代方法,我会推荐使用Mojo::UserAgentMojo::DOM来代替。

以下使用css选择器div#price_amount轻松找到您需要的元素并将其打印出来。

use strict; 
use warnings; 

use Mojo::UserAgent; 

my $url = 'https://www.airbnb.com/rooms/1976460'; 
my $dom = Mojo::UserAgent->new->get($url)->res->dom; 

my $price_day = $dom->at(q{div#price_amount})->all_text; 

print $price_day, "\n"; 

输出:

$285 

注意,是有帮助的8分钟介绍视频这套模块的Mojocast Episode 5