Разобрать HTML-страницу на наличие ссылок с регулярным выражением с использованием Perl

StackOverflow https://stackoverflow.com/questions/1683555

Вопрос

Возможный дубликат:
Как удалить внешние ссылки из HTML с помощью Perl?

Хорошо, сейчас я работаю над заказом для клиента, который только что переключил выбор языка на Perl.Я не лучший знаток Perl, но я уже делал с ним подобные вещи, хотя и некоторое время назад.

Таких ссылок много:

<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');" class="bnone">Death Becomes Her
        (1992)</a>

Я хочу сопоставить путь «/en/subtitles/3586224/death-becomes-her-en» и поместить их в массив или список (не уверен, какие из них лучше в Perl).Я искал документацию по Perl, а также просматривал учебные пособия по регулярным выражениям, и большинство, если не все, казалось, были ориентированы на использование ~= для сопоставления, а не для захвата совпадений.

Спасибо,

Коди

Это было полезно?

Решение

Используйте правильный парсер HTML для анализа HTML.Видеть этот пример включено в HTML::Парсер.

Или рассмотрим следующий простой пример:

#!/usr/bin/perl

use strict; use warnings;

use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new(\*DATA);

my @hrefs;

while ( my $anchor = $parser->get_tag('a') ) {
    if ( my $href = $anchor->get_attr('href') ) {
        push @hrefs, $href if $href =~ m!/en/subtitles/!;
    }
}

print "$_\n" for @hrefs;

__DATA__
<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath 
Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');" 
class="bnone">Death Becomes Her
                (1992)</a>

Выход:

/en/subtitles/3586224/death-becomes-her-en

Другие советы

Не используйте регулярные выражения.Используйте парсер HTML, например HTML::Деревостроитель.

my @links;
my $tree = HTML::TreeBuilder->new; # empty tree
$tree->parse_file($file_name);
$tree->elementify;

my @links = map { $_->attr('href') } $tree->look_down( _tag => 'a');

$tree = $tree->delete;

# Do stuff with links array

URL-адреса, подобные приведенному в вашем примере, можно сопоставить с помощью регулярного выражения, например

($url) = /href=\"([^\"]+)\"/i

Если в HTML когда-либо используются одинарные кавычки (или нет кавычек) вокруг URL-адреса или если в URL-адресе когда-либо присутствуют символы кавычек, то это не будет работать правильно.По этой причине вы получите некоторые ответы, в которых говорится, что не следует использовать регулярные выражения для анализа HTML.Прислушайтесь к ним, но продолжайте, если уверены, что ввод будет правильным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top