2

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

2 に答える 2

2

その/XPath の末尾からそれを削除します。

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

すべきです。このままでは、有効な XPath ではありません。

于 2014-09-13T16:21:35.223 に答える
0

XPath に末尾のスラッシュがあり、これを削除する必要があります

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

ただし、私自身のテストから、HTML::TreeBuilder::XPathその特定の URL の解析にも問題があると思われます。おそらく条件付きコメントのせいでしょうか?

別のアプローチとして、代わりにMojo::UserAgentandを使用することをお勧めし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

Mojocast Episode 5には、この一連のモジュールに関する役立つ 8 分間の紹介ビデオがあります。

于 2014-09-21T00:39:37.333 に答える