Xpath не найдет идентификатор
Я не могу получить узел по его идентификатору. Код прост и должен быть понятен.
#!/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;
Как я могу выбрать узел по его идентификатору?
Заранее спасибо.
2 ответа
Возьми это /
от конца этого XPath.
.//*[@id="price_amount"]
следует сделать. Как это, это не действительный XPath.
В вашем 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.