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

如何使用Perl正则表达式从HTML中提取链接?,html,regex,perl,Html,Regex,Perl,我有一个巨大的html,其中有许多我不需要的东西,但里面有以下格式提供的URL: <a href="http://www.retailmenot.com/" class=l 使用,或使用其他链接提取Perl模块之一。你根本不需要正则表达式 这里有一个简短的例子。您不必子类化。您只需告诉%HTML::Tagset::linkElements要收集哪些属性: #!perl use HTML::LinkExtor; $HTML::Tagset::linkElements{'a'} = [ q

我有一个巨大的html,其中有许多我不需要的东西,但里面有以下格式提供的URL:

<a href="http://www.retailmenot.com/" class=l

使用,或使用其他链接提取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;
#!perl
使用HTML::LinkExtor;
$HTML::Tagset::linkElements{'a'}=[qw(href类)];
$p=HTML::LinkExtor->new;
$p->parse(do{local$/;});
我的@links=grep{
我的($tag,%hash)=@$\;
没有“未初始化”的警告;
$hash{class}eq'foo';
}$p->链接;
如果您需要收集任何其他标记的URL,您可以进行类似的调整

如果您希望有一个回调例程,那也不难。当解析器运行到链接中时,您可以查看这些链接:

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> } );
使用HTML::LinkExtor;
$HTML::Tagset::linkElements{'a'}=[qw(href类)];
我的@links;
我的$callback=sub{
我的($tag,%hash)=@;
没有“未初始化”的警告;
推送@links,$hash{href}如果$hash{class}eq'foo';
};
我的$p=HTML::LinkExtor->new($callback);
$p->parse(do{local$/;});

@soulSurfer2010-您是否收到特定错误?或者只是意外的行为(如果是的话,是什么)?也许你只是有一个打字错误;它说的是
“(.+?”
当它应该是
”(.+?)“
时,我试过了,但还是不行……我没有收到错误。@soulSurfer2010,请编辑你的修订和你试过的(这一条之前的两条注释)到问题中(点击标签下面的“编辑”链接)。它的格式看起来更好,而且更容易阅读和使用。为什么没有人链接到这个经典?很棒的模块,但似乎我不仅需要HREF,而且链接后有“class=l”的HREF…HTML::LinkExtor可以帮助您确定设置了哪些其他属性。@brian d foy,HTML::LinkExtor只收集URL属性。它不收集
属性。您必须将其子类化,以忽略带有错误
类的链接。很抱歉,我没有时间更早地生成一个示例。不需要子类。“你根本不需要正则表达式。”而且你根本不应该使用正则表达式。有人说,如果有任何短语应该在上面加上标记,那么“您不能使用正则表达式来解析XML”肯定是其中之一。
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> } );