如何从HTML链接中提取HREF值?

时间:2009-05-29 16:01:42

标签: html regex perl

我的文字文件包含2行:

<IMG SRC="/icons/folder.gif" ALT="[DIR]"> <A HREF="yahoo.com.jp/">yahoo.com.jp/</A>
</PRE><HR>

在我的Perl脚本中,我有:

my $String =~ /.*(HREF=")(.*)(">)/;
print "$2";

我的输出如下:

Output 1: yahoo.com.jp

Output 2: ><HR>

我想要实现的是让我的Perl脚本自动提取<A Href="">

中的字符串

由于我是正则表达式的新手,我想问一下我的正则表达式是否是一个形式错误的正则表达式?如果是这样,有人可以提供一些建议,让它看起来更好吗?

其次,我不知道为什么我的第二个输出是"><HR>",我认为预期的行为是将跳过output2,因为它不包含HREF =“。显然我错了。

感谢您的帮助。

4 个答案:

答案 0 :(得分:8)

使用正则表达式解析HTML的工作经常足以让你陷入虚假的安全感。对于控制输入的简单情况,您可以使用它,但最好使用HTML::Parser之类的东西。

答案 1 :(得分:8)

要回答有关您的正则表达式无法正常工作的具体问题,您使用的是.*,这是“贪婪” - 默认情况下会尽可能多地匹配。替代方案是使用非贪婪的形式,.*?,或者对你想要匹配的东西更加严格。例如,[^"]*将匹配任何不是双引号的内容,这似乎是您正在寻找的内容。

但是,是的,其他海报是正确的 - 使用正则表达式来做任何在HTML解析中非常重要的事情都是灾难的一个方法。从技术上讲,你可以正确地完成它,特别是在Perl 5.10(具有更高级的正则表达式功能)中,但它通常不值得头疼。

答案 2 :(得分:0)

如果可以,我想建议最简单这样做的方式(它可能不是最快或最轻的方式):HTML::TreeBuilder::XPath

它为您提供了非格式化HTML中XPath的强大功能。

use HTML::TreeBuilder::XPath;

my $tree= HTML::TreeBuilder::XPath->new_from_file( 'D:\Archive\XPath.pm.htm' );
my @hrefs = $tree->findvalues( '//div[@class="noprint"]/a/@href');
print "The links are: ", join( ',', @hrefs ), "\n";

答案 3 :(得分:-1)

当尝试使用正则表达式匹配HTML(或XML)时,您必须小心使用。你很少想要一个。因为start是一个贪婪的修饰符,它会尽可能地匹配。正如Gumbo所示,使用字符类说明符[^“] *来匹配除引号之外的所有字符。这将匹配到结束引号。您可能还想使用类似的东西来匹配尖括号。试试这个:

/HREF="([^"]*)"[^>]*>/i

这应该更加一致。