2014-09-13 6 views
2

Я не могу получить узел по его идентификатору. Код прямолинейный и должен быть самообучающимся.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 'say g (" https://www.airbnb.com/rooms/1976460 ") -> dom-> find (q {div [id =" price_amount "] }) -> text'' печатает '$ 285'. Mojo :: DOM - хороший модуль ... – jm666

+0

Спасибо за подсказку! Я смотрел дальше в Mojo и, как будто, он использовал CSS-selecetors вместо XPath – 3und80

ответ

2

Возьмите это / с конца этого XPath.

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

следует делать. Как бы то ни было, это неправда XPath.

+1

очень странно. используя perl v5.10, он не работает. но с perl v5.18.2 это .. возможно это помогает другим ^^ – 3und80

0

Существует косую черту в вашем XPath, что вам нужно удалить

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

Однако, из моего собственного тестирования, я считаю, что HTML::TreeBuilder::XPath также возникают проблемы при разборе, что конкретного URL. Возможно, из-за условных комментариев?

В качестве альтернативного подхода я бы рекомендовал вместо этого использовать Mojo::UserAgent и Mojo::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.

 Смежные вопросы

  • Нет связанных вопросов^_^