使用HTML::TreeBuilder::XPath获取href值

3
我正在使用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

感谢任何帮助!
1个回答

7
这里有几个问题。
  • 每个Perl程序的顶部必须始终使用use strictuse warnings。它可以捕获您容易忽略的许多错误,并且在请求代码帮助时只是礼貌。在这种情况下,它会警告您的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

哇,非常感谢!我会采纳您的建议并始终使用严格模式和警告。这太完美了! - BluGeni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接