2012-12-09 31 views
0

我试图解析HTML文档并提取网址,但无法弄清楚如何获得'a'标签的href值。如果有帮助,我正在关注此文档:http://perl.active-venture.com/lib/HTML/TokeParser.html使用Perl的TokeParser从标签中提取URL

此问题位于第三个'elsif'代码块内。

sub findTokens { 
my $htmlFileName = $_[0]; 
my $pagesDir = $_[1]; 
my %titles = %{$_[2]}; 
my %mapping = %{$_[3]}; 
my @outLinks; 

my $p = HTML::TokeParser->new("$pagesDir$htmlFileName") 
    or die("Can't open $htmlFileName: \n"); 
my @tokens; 
my $url = $mapping{$htmlFileName}; 

while (my $newChunk = $p->get_token) { 

     if ($newChunk->[0] eq 'T') { 
      my @lineArray = split(' ', $newChunk->[1]); 
      foreach my $i (@lineArray) { 
       if (lc($i) =~ /^[a-z]*\-?\'?s?$/) { 
        push(@tokens, lc($i)); 
       } 
      } 
     } elsif ($newChunk->[0] eq 'S') { 
      if ($newChunk->[1] eq 'title') { 
       $newChunk = $p->get_token; 
        $titles{$url} = $newChunk->[1]; 
        #print $url; 
        #print $titles{$url}; 
      } 
     } elsif ($newChunk->[0] eq 'S') { 
      if ($newChunk->[1] eq 'a') { 

       my %attr = %{$newChunk->[2]}; 
       push(@outLinks, $attr{'href'}); 
      } 
     } 
} 

return (\@tokens, \%titles, \@outLinks); 

}

+0

既然你贴有“J/K固定它大声笑我爱AMBIGIOUS文档”作为回答,我投票关闭这个太现已本地化。 –

+0

如果您打算链接到Perl模块,请使用http://search.cpan.org/ http://metacpan.org或http://p3rl.org链接。 (如果Perl自带的话,你甚至可以使用http://perldoc.perl.org链接。) –

回答

1

恕我直言,HTML::TokeParser代表的老同学。

因为我知道HTML::TreeBuilder::XPath,我不能回到古老。

例如在你的信息:

#!/usr/bin/env perl 

use strict; use warnings; 

use WWW::Mechanize; 
use HTML::TreeBuilder::XPath; 

my $m = WWW::Mechanize->new(autocheck => 1); 
$m->get("http://stackoverflow.com/q/13790575/465183"); 

my $tree = HTML::TreeBuilder::XPath->new_from_content($m->content); 

print join "\n", $tree->findvalues('.//a/@href'); 

http://en.wikipedia.org/wiki/Xpath

+0

更像懒惰的学校(不是懒惰肯定是一件坏事......)。 TokeParser将以更少的运行时间和更少的内存使用量为您提供答案。 HTBX会以较少的代码给你答案。 – hobbs

+0

不知道什么是HTBX hobbs –

+0

@sputnick:HTBX = HTML :: TreeBuilder :: XPath –