正则表达式捕获和存储网址

时间:2014-03-22 23:36:39

标签: html regex perl web-scraping

我对perl非常陌生,我试图从网站上收集链接和图像。我目前正在阅读有关regular expressions的内容,到目前为止,我已设法获取包含链接或图片的html行(至少我相信如此)

/<img src|<a href/i     #I'm just comparing every line of html to this

但是如何捕获和存储实际网址?基本上是这样的:

<img src="http://i1.nyt.com/images/2014/03/23/us/23marriage2/23marriage2-largeHorizontal375.jpg"

进入这个:

http://i1.nyt.com/images/2014/03/23/us/23marriage2/23marriage2-largeHorizontal375.jpg

3 个答案:

答案 0 :(得分:1)

更现代的网络客户端和解析器之一是Mojo::UserAgentMojo::DOM。有一个8分钟的网络广播,可以很好地介绍他们的功能:MojoCast episode 5

为了从您请求的示例中提取所有链接和图像,只需要以下内容:

use strict;
use warnings;

use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;
my $dom = $ua->get('http://www.nytimes.com')->res->dom;

# Print all href's
for my $href ($dom->find('a')->attr('href')->each) {
    print "$href\n";
}

# Print all img src's
for my $img ($dom->find('img')->attr('src')->each) {
    print "$img\n";
}

注意:这些模块包含在Mojolicious

的基本安装中

答案 1 :(得分:0)

快速而肮脏:/(<img src|<a href)="([^"]*?)"/i然后你应该使用第二个捕获组(第二组括号)。

答案 2 :(得分:0)

一般来说,我建议使用像HTML::TreeBuilder而非正则表达式来解析HTML。

说,你当然可以尝试使用正则表达式来获取你所追求的内容 - 但它非常依赖于你的源材料。通常会捕获img src或href的东西会有点像(例如,假设诸如双引号之类的东西总是被使用,并且比解析解决方案更脆弱):

/<img[^>]*?src="([^"]*)"|<a[^>]*?href="([^"]*)"/i

如果匹配,则图片网址将位于$1中,或链接位于$2