【问题标题】:Xpath won't fiind idXpath 找不到 id
【发布时间】:2014-11-07 15:04:28
【问题描述】:

我无法通过 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 选择节点?

提前致谢。

【问题讨论】:

  • 离题,但perl -Mojo -E 'say g("https://www.airbnb.com/rooms/1976460")->dom->find(q{div[id="price_amount"]})->text' 打印$285。 Mojo::DOM 是一个不错的模块...
  • 感谢您的提示!我进一步研究了 Mojo 并喜欢它使用 CSS 选择器而不是 XPath

标签: perl xpath html-tree html-treebuilder


【解决方案1】:

/ 从 XPath 的末尾取出。

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

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

【讨论】:

  • 很奇怪。使用 perl v5.10 它不起作用。但是对于 perl v5.18.2 它是.. 也许这对其他人有帮助^^
【解决方案2】:

您的 XPath 中有一个斜杠,您需要将其删除

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

但是,根据我自己的测试,我相信 HTML::TreeBuilder::XPath 在解析该特定 URL 时也有问题。也许是因为有条件的 cmets?

作为替代方法,我建议改用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

请注意,Mojocast Episode 5 有一个有用的 8 分钟介绍性视频来介绍这组模块。

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2018-10-05
    相关资源
    最近更新 更多