Я очень новичок в Perl, и я пытаюсь собрать ссылки и изображения с веб-сайта. В настоящее время я читаю о регулярных выражениях, и до сих пор мне удалось получить строки 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 :: TreeBuilder, а не регулярные выражения для синтаксического анализа HTML.
Говоря это, вы можете, конечно, попробовать и использовать регулярные выражения, чтобы получить то, что вам нужно, но это очень зависит от вашего исходного материала. Что-то, что в общем случае захватило бы img src или href, было бы чем-то вроде (например, такие вещи, как, например, двойные кавычки, которые будут использоваться, и будут намного более хрупкими, чем решение для синтаксического анализа):
/<img[^>]*?src="([^"]*)"|<a[^>]*?href="([^"]*)"/i
Затем, если он совпадает, URL-адрес изображения будет равен $1
, или ссылка будет равна $2
.
Одним из наиболее современных веб-клиентов и парсеров является Mojo::UserAgent
и Mojo::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
Быстрая и грязная: /(<img src|<a href)="([^"]*?)"/i
тогда вы должны использовать вторую группу захвата (вторая группа круглых скобок).