3

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

到目前为止,我的代码是:

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

谢谢你的帮助!

4

1 回答 1

7

这里有很多问题。

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

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

  • 根本不需要使用LWP,构造函数将为您获取 HTML 页面。HTML::TreeBuildernew_from_url

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

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
于 2013-01-21T04:35:54.523 回答