使用perl lwp linkextractor下载文件

问题描述 投票:0回答:1

我正在尝试从网页下载文件。

首先,我获得了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.

提前感谢!

perl url get lwp html-tableextract
1个回答
0
投票

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或类似的信息。

© www.soinside.com 2019 - 2024. All rights reserved.