Разобрать HTML-страницу на наличие ссылок с регулярным выражением с использованием Perl
-
18-09-2019 - |
Вопрос
Возможный дубликат:
Как удалить внешние ссылки из 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.Прислушайтесь к ним, но продолжайте, если уверены, что ввод будет правильным.