【问题标题】:Regex to capture and store url正则表达式捕获和存储 url
【发布时间】:2014-04-30 09:00:18
【问题描述】:

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

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

但是如何捕获和存储实际的 url?基本上变成这样:

<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

【问题讨论】:

标签: html regex perl web-scraping


【解决方案1】:

更现代的 Web 客户端和解析器之一是 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的基础安装中

【讨论】:

    【解决方案2】:

    一般来说,我建议使用类似的东西,例如HTML::TreeBuilder 而不是正则表达式来解析 HTML。

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

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

    如果匹配,图像 URL 将位于 $1,或者链接将位于 $2

    【讨论】:

      【解决方案3】:

      又快又脏:/(&lt;img src|&lt;a href)="([^"]*?)"/i 那么你应该使用第二个捕获组(第二组括号)。

      【讨论】:

      • 顺便说一句,这个正则表达式不会尝试捕获有效的 URL,它会匹配 "" 中的所有内容(直到下一个 '"')。
      • 已编辑:我忘记了 * 重复以匹配 0 个或更多字符。还加了?使其不贪婪。
      • 如果 '
      • 我知道,这就是为什么又快又脏 ;)
      • 你也应该删除
      猜你喜欢
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2014-01-02
      • 2015-01-20
      • 2016-02-10
      • 1970-01-01
      相关资源
      最近更新 更多