【问题标题】:Accessing an href value using HTML::TreeBuilder::XPath使用 HTML::TreeBuilder::XPath 访问 href 值
【发布时间】:2013-01-21 03:13:08
【问题描述】:

我正在使用LWP::UserAgentHTML::Selector::XPathHTML::TreeBuilder::XPath 模块获取一组搜索结果中第一个 YouTube 视频的 href 属性的值。

到目前为止我的代码是:

use LWP::UserAgent;
use HTML::TreeBuilder::XPath;
use HTML::Selector::XPath;

my $ua = LWP::UserAgent->new;

#my $response =..
my $html = "http://www.youtube.com/results?search_query=run+flo+rida";

my $tree = HTML::TreeBuilder::XPath->new;

my $xpath = HTML::Selector::XPath::selector_to_xpath("(//*[@id = 'search-results']/li)[1]/div[2]/h3/a/@href/");
my @nodes = $tree->findnodes($xpath);
print" $nodes[0]";

我不确定我的打印是否不正确,或者其他语法是否错误。截至目前它打印

HTML::TreeBuilder::XPath=HASH(0x1a78250)

当我要打印时

/watch?v=JP68g3SYObU

感谢您的帮助!

【问题讨论】:

    标签: perl xpath


    【解决方案1】:

    这里有很多问题。

    • 必须始终 use strictuse warnings 在每个 Perl 程序的顶部。它会捕获许多您很容易忽略的错误,并且仅在您寻求代码帮助时才礼貌。在这种情况下,它会警告您,您的 XPath 字符串包含数组变量名称 @id@href,您可能不打算将它们插入到字符串中。

    • 您正在使用 HTML::Selector::XPath,它将 CSS 选择器转换为 XPath 表达式。但是你给它提供了一个 XPath 表达式,所以它不起作用并且不需要该模块。

    • 根本不需要使用LWP,因为HTML::TreeBuilder 有一个new_from_url 构造函数,它将为您获取HTML 页面。

    这个程序似乎可以满足您的需求。我还添加了 URI 模块以从 href 属性值中的相对 URL 派生绝对 URL。

    use strict;
    use warnings;
    
    use HTML::TreeBuilder::XPath;
    use URI;
    
    my $url = "http://www.youtube.com/results?search_query=run+flo+rida";
    
    my $tree = HTML::TreeBuilder::XPath->new_from_url($url);
    
    my $anchor = $tree->findnodes('//ol[@id="search-results"]//h3[@class="yt-lockup2-title"]/a/@href');
    my $href = URI->new_abs($anchor->[0]->getValue, $url);
    print $href;
    

    输出

    http://www.youtube.com/watch?v=JP68g3SYObU
    

    【讨论】:

    • 哇,非常感谢你,我会接受你的建议,并始终使用严格和警告。这是完美的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2016-11-14
    • 2013-08-07
    • 2018-10-16
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多