【问题标题】:Parse HTML Page For Links With Regex Using Perl [duplicate]使用 Perl 解析带有正则表达式的链接的 HTML 页面 [重复]
【发布时间】:2010-12-13 14:28:58
【问题描述】:

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

谢谢,

科迪

【问题讨论】:

  • 您的问题令人困惑:1. Perl 中的列表和数组之间存在区别,但这不是您似乎想到的那种区别。 2. 要捕获匹配项,请使用 =~。这是 Perl 中不存在的另一个区别。
  • 谢谢,Ether,我无法决定从众多问题中选择哪一个。
  • 巴特,PHP 已经结束了。另外,我已经阅读了其他问题以及以太的 cmets 和 Sinan 的问题。我一直是那些说“Regex 适合一切!”的人之一。自从我克服了学习曲线。不过,我现在正在研究 HTML::Parser,我应该能够很快完成这个项目。我今天就可以完成这个项目了! :)

标签: html regex perl parsing html-parsing


【解决方案1】:

使用适当的 HTML 解析器来解析 HTML。请参阅HTML::Parser 中包含的this example

或者,考虑以下简单示例:

#!/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(我没有投票了)。
  • 谢谢你,克里斯。多次遇到这种情况;-)
【解决方案2】:

不要使用正则表达式。使用像 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

【讨论】:

  • +1 可以,但是对于大小未知的文件,我倾向于避免构建整个文档树。
  • HTML::TreeBuilder 轻松满足了我的所有需求。我从来不需要解析需要一个逐行类型解析器的巨大 HTML 文件,所以我不能直接删除这样的脚本。但是,如果您有很大的文件,您肯定不想将整个树保存在 RAM 中。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2018-04-29
    • 2014-10-28
    • 2010-09-05
    • 2018-09-10
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多