Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用HTML::TreeBuilder::XPath访问href值_Perl_Xpath - Fatal编程技术网

Perl 使用HTML::TreeBuilder::XPath访问href值

Perl 使用HTML::TreeBuilder::XPath访问href值,perl,xpath,Perl,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+

我用的是, 和 用于获取一组搜索结果中第一个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程序的顶部,必须始终
    使用strict
    使用warnings
    。它将捕获许多您容易忽略的错误,并且只有在您请求代码帮助时才有礼貌。在这种情况下,它会警告您XPath字符串包含数组变量名
    @id
    @href
    ,您可能不希望将这些变量名插入字符串中

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

  • 根本不需要使用
    LWP
    ,因为
    HTML::TreeBuilder
    有一个
    new\u from\u 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

哇,非常感谢你,我会接受你的建议,并始终使用严格和警告。这太完美了!