Регулярное выражение для захвата и хранения URL

0

Я очень новичок в 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
  • 0
    Вы можете рассмотреть синтаксический анализ данных, а не рассматривать их как текстовую строку, чтобы сопоставить регулярные выражения. Существует намного больше перестановок HTML, чем когда-либо сможет найти любое регулярное выражение. search.cpan.org/~msergeant/XML-Parser-2.36/Parser.pm
Теги:
web-scraping

3 ответа

0
Лучший ответ

В общем, я рекомендую использовать что-то вроде, например, HTML :: TreeBuilder, а не регулярные выражения для синтаксического анализа HTML.

Говоря это, вы можете, конечно, попробовать и использовать регулярные выражения, чтобы получить то, что вам нужно, но это очень зависит от вашего исходного материала. Что-то, что в общем случае захватило бы img src или href, было бы чем-то вроде (например, такие вещи, как, например, двойные кавычки, которые будут использоваться, и будут намного более хрупкими, чем решение для синтаксического анализа):

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

Затем, если он совпадает, URL-адрес изображения будет равен $1, или ссылка будет равна $2.

1

Одним из наиболее современных веб-клиентов и парсеров является 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

0

Быстрая и грязная: /(<img src|<a href)="([^"]*?)"/i тогда вы должны использовать вторую группу захвата (вторая группа круглых скобок).

  • 0
    Кстати, это регулярное выражение не пытается захватить действительный URL, оно соответствует всему, что находится внутри "" (до следующего "").
  • 0
    Отредактировано: я забыл * повторить, чтобы соответствовать 0 или более символов. Также добавлено? сделать это не жадным.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню