我正在使用LWP::UserAgent
,
HTML::Selector::XPath
和
HTML::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
感谢您的帮助!
答案 0 :(得分:7)
这里有很多问题。
您必须始终 use strict
和use 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