Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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::TokeParser&;URI_Perl - Fatal编程技术网

Perl 提取内部链接<;部门>';使用HTML::TokeParser&;URI

Perl 提取内部链接<;部门>';使用HTML::TokeParser&;URI,perl,Perl,我是Perl的老新手,我正在尝试使用HTML::Parser和URI在Perl中创建一个子例程 我需要提取被称为“区域提取”的div中包含的所有有效链接 这是我的代码: #More perl above here... use strict and other subs use HTML::TokeParser; use URI; sub extract_links_from_response { my $response = $_[0]; my $base = URI->new( $r

我是Perl的老新手,我正在尝试使用HTML::Parser和URI在Perl中创建一个子例程

我需要提取被称为“区域提取”的div中包含的所有有效链接

这是我的代码:

#More perl above here... use strict and other subs
use HTML::TokeParser;
use URI;
sub extract_links_from_response {
my $response = $_[0];

my $base = URI->new( $response->base )->canonical;
# "canonical" returns it in the one "official" tidy form

my $stream = HTML::TokeParser->new( $response->content_ref );
my $page_url = URI->new( $response->request->uri );

print "Extracting links from: $page_url\n";

my($tag, $link_url);

while ( my $div = $stream->get_tag('div') ) {

   my $id = $div->get_attr('id');
   next unless defined($id) and $id eq 'zone-extract';

      while( $tag = $stream->get_tag('a') ) {
      next unless defined($link_url = $tag->[1]{'href'});
      next if $link_url =~ m/\s/; # If it's got whitespace, it's a bad URL.
      next unless length $link_url; # sanity check!

      $link_url = URI->new_abs($link_url, $base)->canonical;
      next unless $link_url->scheme eq 'http'; # sanity

      $link_url->fragment(undef); # chop off any "#foo" part

      print $link_url unless $link_url->eq($page_url); # Don't note links to itself!
  }
}
  return;
}
如您所见,我有两个循环,首先使用get_标记'div',然后查找id='zone extract'。第二个循环在这个div中查找并检索所有链接(或者这是我的意图)

内部循环工作,它提取所有链接正确独立工作,但我认为在第一个循环中存在一些问题,寻找我想要的div“区域提取”。。。我用这篇文章作为参考:

但目前我所知道的只是这个错误:

Can't call method "get_attr" on unblessed reference
一些想法?救命啊! 我的HTML(注意URL到摘录1和2):


  • Pág

  • 我发现TokeParser是一个非常粗糙的工具,需要太多的代码,它的缺点是只支持过程式编程

    由于采用声明式编程,需要较少代码的更好替代方案是:


    代码未经测试,因为问题中没有HTML示例。

    首先,始终使用严格的使用警告。每一个单身。时间因此,启用
    strict
    warnings
    ,在尝试使用
    get\u attr
    之前,添加以下内容:
    使用数据::转储程序;打印转储程序($div)。“\n”<more html above here>
    <div class="span-48 last">
    <div class="span-37">
        <div id="zone-extract" class="...">
            <h2 class="genres"><img alt="extracting" class="png"></h2>  
                        <li><a title="Extr 2" href="**URL_TO_EXTRACT_1**">2</a></li>
                        <li><a title="Con 1" class="sel" href="**URL_TO_EXTRACT_2**">1</a></li>
                <li class="first">Pàg</li>
        </div>
    </div>      
    </div>
    <more stuff from here>
    
    use Web::Query 'wq';
    my $results = wq($response)->find('div#zone-extract a')->map(sub {
        my (undef, $elem_a) = @_;
        my $link_url = $elem_a->attr('href');
        return unless $link_url && $link_url !~ m/\s/ && …
        # Further checks like in the question go here.
    
        return [$link_url => $elem_a->text];
    });