我正在尝试从网页下载文件。
首先,我获得了linkextractor的链接,然后我要使用lwp下载它们我是perl的新手编程。
我编写了以下代码...
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TableExtract;
use HTML::LinkExtractor;
use LWP::Simple qw(get);
use Archive::Zip;
my $html = get $ARGV[0];
my $te = HTML::TableExtract->new(
keep_html => 1,
headers => [qw( column1 column2 )],
);
$te->parse($html);
# I get only the first row
my ($row) = $te->rows;
my $LXM = new HTML::LinkExtractor(undef,undef,1);
$LXM->parse(\$$row[0]);
my ($t) = $LXM->links;
my $LXS = new HTML::LinkExtractor(undef,undef,1);
$LXS->parse(\$$row[1]);
my ($s) = $LXS->links;
#-------
for (my $i=0; $i < scalar(@$s); $i++) {
print "$$s[$i]{_TEXT} $$s[$i]{href} $$t[$i]{href} \n";
my $file = '/tmp/$$s[$i]{_TEXT}';
my $url = $$s[$i]{href};
my $content = getstore($url, $file);
die "Couldn't get it!" unless defined $content;
}
我收到以下错误
Undefined subroutine &main::getstore called at ./geturlfromtable.pl line 35.
提前感谢!
LWP :: Simple可以通过两种不同的方式加载。
use LWP::Simple;
这将加载模块并使所有功能可供您的程序使用。
use LWP::Simple qw(list of function names);
这将加载模块,并且仅提供您所请求的特定功能集。
您有此代码:
use LWP::Simple qw(get);
[这使get()
功能可用,但没有getstore()
功能。
要解决此问题,请在您的功能列表中添加getstore()
。
use LWP::Simple qw(get getstore);
或者(可能更简单)删除功能列表。
use LWP::Simple;
更新:我希望您不要介意我添加几个样式点。
首先,您使用的是一个非常老的模块-HTML :: LinkExtractor。它已经近十五年没有更新了。我建议改用HTML::LinkExtor。
其次,您的代码使用了大量引用,但是您使用它们的方式确实过于复杂。例如,如果您有\$$row[0]
,则实际上只需要$row->[0]
。同样,如果将$$s[$i]{href}
编写为$s->[$i]{href}
,则对大多数人来说很容易理解。
[接下来,您使用C样式进行循环,并遍历数组的索引。通常,使用foreach
从零迭代到数组中的最后一个索引通常更简单。
foreach my $i (0 .. $#$s) {
print "$s->[$i]{_TEXT} $s->[$i]{href} $t->[$i]{href} \n";
my $file = "/tmp/$s->[$i]{_TEXT}";
my $url = $s->[$i]{href};
my $content = getstore($url, $file);
die "Couldn't get it!" unless defined $content;
}
最后,您似乎对getstore()
的返回结果有些困惑。它返回HTTP响应代码。因此,它永远不会是不确定的。如果检索内容时遇到问题,您将获得500或403或类似的信息。