2014-09-13 81 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