0

可能重复:
如何使用 Perl 从 HTML 中删除外部链接?

好的,我现在正在为一位刚刚将语言选择切换到 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 文档,以及查看正则表达式教程,并且大多数(如果不是全部)似乎都倾向于使用 ~= 来匹配内容而不是捕获匹配项。

谢谢,

科迪

4

3 回答 3

10

使用适当的 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
于 2009-11-05T21:03:41.723 回答
4

不要使用正则表达式。使用HTML::TreeBuilder 之类的 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
于 2009-11-05T21:08:53.850 回答
0

您的示例中的 URL 可以与正则表达式匹配,例如

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

如果 HTML 曾经在 URL 周围使用单引号(或不使用引号),或者 URL 中曾经有引号字符,那么这将无法正常工作。出于这个原因,您会得到一些答案,告诉您不要使用正则表达式来解析 HTML。注意他们,但如果您确信输入会表现良好,请继续。

于 2009-11-05T21:08:44.060 回答