2010-12-12 88 views
-1

这应该是一个简单的正则表达式,但我似乎无法弄清楚。Perl正则表达式从HTML中提取URL

有人可以提供一个单线程来接受任意字符串的任意HTML输入,并填充HTML代码中所有Facebook URL(匹配http://www.facebook.com)的数组吗?

我不想使用任何CPAN模块,并会更喜欢简单的正则表达式1班轮。

在此先感谢您的帮助!

+1

看看这个答案︰http://stackoverflow.com/questions/30847/regex-to-validate-uris – supercheetah 2010-12-12 23:13:43

+1

**任意** HTML,呃?它必须“在一条线上”,一条线?我希望它不必适合80列!并没有CPAN模块。那么,我**可以**,但我不确定,但你不希望我。你想要一个正确的答案,还是一个只是偶尔工作的人?关于评论或脚本片段中的网址怎么样?那些被实体隐藏的东西呢?标签中间是否有评论? – tchrist 2011-02-26 01:30:08

回答

5

强制性的链接解释why you shouldn't parse HTML using a regular expression

如此说来,试试这个一个快速和肮脏的解决方案:

my $html = '<a href="http://www.facebook.com/">A link!</a>'; 
my @links = $html =~ /<a[^>]*\shref=['"](https?:\/\/www\.facebook\.com[^"']*)["']/gis; 
+0

这就是我一直在寻找,我很欣赏为什么不使用正则表达式的解释。我想要快速又脏的东西,稍后再回来清理。谢谢。 – 2010-12-12 23:54:40

+1

我反对告诉人们如何在原则上这样做,但+1无论如何使用否定字符类而不是'。*?'(或者更糟,只是'。*')。 – 2010-12-13 11:43:58

0

也许这可以帮助你:

if ($input =~ /(http:\/\/www\.facebook\.com\/\S+)/) { push(@urls, $1); } 
+0

没有评论正则表达式,为什么不讽刺整个html页面,然后做'@urls = $ html =〜/([regex])/ gm'或者'/ gs',我总是会忘记。尽管如此,你只需一杆就可以完成所有的比赛。 – 2011-02-26 04:57:27

5

HTML::LinkExtor。浪费你的生命能量(也不是我们的)尝试使用正则表达式来完成这个任务是毫无意义的。

+0

如果我们决定去HTML :: LinkExtor的方向,你可以提供一些示例代码来说明这可能如何工作。谢谢! – 2010-12-12 23:54:02

+2

请参阅文档。 – 2010-12-13 01:09:28

+1

为什么要试图帮助这个家伙,如果你要说的是“看到文档” – Literat 2011-02-25 23:35:16

1

拉塞尔C,你有没有看过Facebook电影的开始,马克扎克伯格使用Perl自动从大学的facebook里提取所有照片(然后在线发布)。我就像“这就是我要做的!我也会用Perl!” (除了它可能需要几天才能完成,而不是2分钟)。无论如何,我会使用该模块WWW ::机械化提取链接(或照片):

use strict; use WWW::Mechanize; open (OUT, ">out.txt"); my $url="http://www.facebook.com"; my $mech=WWW::Mechanize->new(); $mech->get($url); my @a = $mech->links; print OUT "\n", $a[$_]->url for (0..$#a);

但是这不会让您登录到你的Facebook页面,只是会需要你在日志中屏幕。我会使用HTTP :: Cookies登录。为此,请参阅文档。只是在开玩笑,只是问。哦,上帝,苹果馅饼正在燃烧!