如何从Perl中的正文电子邮件中提取href?

时间:2013-09-04 15:04:48

标签: regex perl email html-parsing

我很想提取一些网址,这可能是一个以上的网页邮件。

我正试图用这个来解析网址:

use strict;
use warnings;
use Net::IMAP::Simple;
use Email::Simple;
use IO::Socket::SSL;

# here must be the connection to imap hidden for economize space

my $es = Email::Simple->new( join '', @{ $imap->get($i) } );
my $text = $es->body;
print $text;
my $matches = ($text =~/<a[^>]*href="([^"]*)"[^>]*>.*<\/a>/);
print $matches;

在$ text上我有下一个文字:

 --047d7b47229eb3d9f404e58fd90a
    Content-Type: text/plain; charset=ISO-8859-1

    Try1 <http://www.washingtonpost.com/>

    Try2 <http://www.thesun.co.uk/sol/homepage/>

    --047d7b47229eb3d9f404e58fd90a
    Content-Type: text/html; charset=ISO-8859-1

    <div dir="ltr"><a href="http://www.washingtonpost.com/">Try1</a><br><div><br></div><div><a href="http://www.thesun.co.uk/sol/homepage/">Try2</a><br></div></div>

    --047d7b47229eb3d9f404e58fd90a--

程序的输出,给我一个1 ......就是这样。

任何人都可以提供帮助??

感谢您的建议。

2 个答案:

答案 0 :(得分:6)

Email :: Simple不适合MIME邮件。请改用Courriel。正则表达式不适合HTML解析。请改用Web::Query

use Courriel qw();
use Web::Query qw();

my $email = Courriel->parse( text => join …);
my $html = $email->html_body_part;
my @url = Web::Query->new_from_html($html)->find('a[href]')->attr('href');
__END__
http://www.washingtonpost.com/
http://www.thesun.co.uk/sol/homepage/

答案 1 :(得分:2)

关于使用不同的电子邮件处理模块而不是使用正则表达式解析HTML的建议是好的,你应该注意它。

但是没有人解释为什么你的代码会给你不正确的结果。

这是因为您在标量上下文中调用匹配运算符。在标量上下文中,它返回一个布尔值,指示匹配是否成功。因此,你得到的是1(真实)。

要从正则表达式匹配中获取捕获,您需要在列表上下文中调用匹配运算符。这可能很简单:

my ($matches) = ($text =~/<a[^>]*href="([^"]*)"[^>]*>.*<\/a>/);

但是如果您想要将/ g添加到匹配运算符并获得多个匹配项,您可以考虑使用数组。

my @matches = ($text =~/<a[^>]*href="([^"]*)"[^>]*>.*<\/a>/g);