0

HTML ドキュメントを解析して URL を抽出しようとしていますが、「a」タグの href 値を取得する方法がわかりません。役立つ場合は、このドキュメントを探しています: http://perl.active-venture.com/lib/HTML/TokeParser.html

問題は、3 番目の「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);

}

4

1 に答える 1

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を参照してください

于 2012-12-09T19:10:33.500 に答える