我正在编写一个基本脚本,它只从网页中提取所有链接。它是用Perl编写的,使用了WWW::Mechanical和HTML::Treebuilder::Xpath模块,这两个模块我都是通过CPAN安装的。
我知道只使用WWW::机械化可以很容易地完成,但我也想学习使用XPath来完成。
因此,脚本将解析整个网页,并检查每个锚标记的href属性,提取链接并将其打印到控制台/写入文件。请注意,在下面的脚本中,我没有使用use strict,因为我写这篇文章只是为了澄清和理解使用XPath遍历HTML树的概念。
这是脚本:
#! /usr/bin/perl
use WWW::Mechanize;
use HTML::TreeBuilder::XPath;
use warnings;
$url="https://example.com";
$mech=WWW::Mechanize->new();
$mech->get($url);
$tree=HTML::TreeBuilder::XPath->new();
$tree->parse($mech->content);
$nodes=$tree->findnodes(q{'//a'}); # line is modified later.
foreach $node($nodes)
{
print $node->attr('href');
}
它给出了一个错误:
Can't locate object method "attr" via package "XML::XPathEngine::Literal" at pagegetter.pl line 23.
我修改了如下脚本:
$nodes=$tree->findnodes(q{'//a/@href'});
while($node=$nodes->shift)
{
print $node->attr('href');
}
错误:
Can't locate object method "shift" via package "XML::XPathEngine::Literal"
我不确定如何打印href属性的值。
$nodes是否应该包含所有href属性的列表?我相信它不存储值,而是指向它的指针?
我试着搜索和阅读例子,但我不知道该怎么做
谢谢。
有几个错误。维修:
# list context
my @nodes = $tree->findnodes(
q{//a} # just a string, not a string containings quotes
);
# iterate over array
for my $node (@nodes) {