Анализировать HTML-страницу на предмет ссылок с помощью Regex с помощью Perl

Возможный дубликат:
Как удалить внешние ссылки из 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-стала-her-en» и поместить их в массив или список (не уверен, какие из них лучше в Perl). Я искал документы perl, а также смотрел учебники по регулярным выражениям, и большинство, если не все, казалось, были ориентированы на использование ~ = для сопоставления материалов, а не для захвата совпадений.

Спасибо,

Коди


person codygman    schedule 05.11.2009    source источник
comment
Ваш вопрос сбивает с толку: 1. В Perl есть различие между списками и массивами, но это не то различие, которое вы, кажется, имеете в виду. 2. Для захвата совпадений используйте = ~. Вот еще одно отличие, которого нет в Perl.   -  person innaM    schedule 06.11.2009
comment
обман stackoverflow.com/questions/1598053/ и stackoverflow.com/questions/1651276/   -  person Ether    schedule 06.11.2009
comment
Спасибо, Эфир, я не мог решить, какой из многих-многих вопросов выбрать.   -  person innaM    schedule 06.11.2009
comment
Барт, с PHP все закончилось. Также парень, я читал другие вопросы, а также комментарии Эфира и Синан. Я был одним из тех парней, которые говорят, что Regex подходит для всего! с тех пор, как я преодолел эту кривую обучения. Я сейчас изучаю HTML :: Parser, и с его помощью я смогу закончить этот проект довольно быстро. Я смогу завершить этот проект прямо сейчас! :)   -  person codygman    schedule 06.11.2009


Ответы (3)


Используйте подходящий HTML-парсер для синтаксического анализа HTML. См. этот пример, включенный в HTML :: Parser.

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

#!/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
person Sinan Ünür    schedule 05.11.2009
comment
Метафизический +1 (у меня нет голосов "за"). - person Chris Lutz; 06.11.2009
comment
Спасибо, Крис. Был в такой ситуации много раз ;-) - person Sinan Ünür; 06.11.2009

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

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
person daotoad    schedule 05.11.2009
comment
+1 Это работает, но для файлов неизвестного размера я стараюсь избегать построения всего дерева документа. - person Sinan Ünür; 06.11.2009
comment
HTML :: TreeBuilder легко справился со всеми моими потребностями. Мне никогда не приходилось разбирать огромные HTML-файлы, которым требовался один из построчных парсеров, поэтому я не могу просто убрать такой скрипт. Однако, если у вас огромные файлы, вы определенно не хотите хранить все дерево в ОЗУ. - person daotoad; 06.11.2009

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

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

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

person mob    schedule 05.11.2009