Как извлечь ссылки из HTML с помощью регулярного выражения Perl? - PullRequest
0 голосов
/ 25 сентября 2010

У меня ОГРОМНЫЙ HTML, в котором есть много вещей, которые мне не нужны, но внутри него есть URL-адреса, представленные в следующем формате:

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

Я пытаюсь извлечь URL-адреса ..Я пытался, но безрезультатно:

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

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

Есть идеи, как это сопоставить?

1 Ответ

11 голосов
/ 25 сентября 2010

Используйте 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;

Если вам нужно собрать 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> } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...