使用Perl解析与正则表达式链接的HTML页面

时间:2009-11-05 20:58:09

标签: html regex perl parsing html-parsing

  

可能重复:
  How can I remove external links from HTML using 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-become-her-en”并将它们放入数组或列表中(不确定哪些更好用于Perl)。我一直在搜索perl文档,以及查看正则表达式教程,并且大多数(如果不是全部)似乎都倾向于使用〜=来匹配内容而不是捕获匹配。

谢谢,

科迪

3 个答案:

答案 0 :(得分:10)

使用适当的HTML解析器来解析HTML。请参阅this example附带的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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

如果HTML在URL周围使用单引号(或没有引号),或者URL中有引号字符,那么这将无法正常工作。因此,您将获得一些答案,告诉您不要使用正则表达式来解析HTML。注意它们,但如果你确信输入表现良好,那就继续。