如何使用Perl正则表达式从HTML中提取链接?

sno*_*kin -2 html regex perl

我有一个巨大的HTML,它有很多我不需要的东西,但里面有以下格式提供的URL:

<a href="http://www.retailmenot.com/" class=l
Run Code Online (Sandbox Code Playgroud)

我正在尝试提取网址...我试过,但无济于事:

open(FILE,"<","HTML.htm") or die "$!";
my @str = <FILE>;

my @matches = grep { m/a href="(.+?") class=l/ } @str
Run Code Online (Sandbox Code Playgroud)

有关如何匹配的任何想法?

bri*_*foy 11

使用HTML :: SimpleLinkExtor即可,HTML :: LinkExtor,或其他链接提取的Perl模块之一.你根本不需要正则表达式.

这是一个简短的例子.你没有子类.您只需要告诉%HTML::Tagset::linkElements要收集哪些属性:

#!perl
use HTML::LinkExtor;

$HTML::Tagset::linkElements{'a'} = [ qw( href class ) ];

$p = HTML::LinkExtor->new;
$p->parse( do { local $/; <> } );

my @links = grep { 
    my( $tag, %hash ) = @$_;
    no warnings 'uninitialized';
    $hash{class} eq 'foo';
    } $p->links;
Run Code Online (Sandbox Code Playgroud)

如果您需要收集任何其他代码的网址,请进行类似的调整.

如果您更愿意使用回调例程,那也不是那么难.您可以在解析器遇到链接时观察链接:

use HTML::LinkExtor;

$HTML::Tagset::linkElements{'a'} = [ qw( href class ) ];

my @links;
my $callback = sub {
    my( $tag, %hash ) = @_;
    no warnings 'uninitialized';
    push @links, $hash{href} if $hash{class} eq 'foo';
    };

my $p = HTML::LinkExtor->new( $callback );
$p->parse( do { local $/; <DATA> } );
Run Code Online (Sandbox Code Playgroud)