Perl Regex для извлечения URL-адресов из HTML - PullRequest
0 голосов
/ 13 декабря 2010

Это должно быть простое регулярное выражение, но я не могу понять это.

Может ли кто-нибудь предоставить 1-строчную строку, чтобы взять любую строку произвольного ввода HTML и заполнить массив всеми URL-адресами Facebook (совпадающими http://www.facebook.com), которые были в коде HTML?

Я не хочу использовать какие-либо CPAN-модули и предпочел бы простое регулярное выражение с 1 строкой.

Заранее спасибо за помощь!

Ответы [ 4 ]

4 голосов
/ 13 декабря 2010

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

При этом попробуйте это для быстрого и грязного решения:

my $html = '<a href="http://www.facebook.com/">A link!</a>';
my @links = $html =~ /<a[^>]*\shref=['"](https?:\/\/www\.facebook\.com[^"']*)["']/gis;
4 голосов
/ 13 декабря 2010

См. HTML :: LinkExtor . Нет смысла тратить свою жизненную энергию (ни нашу), пытаясь использовать регулярные выражения для таких задач.

Вы можете прочитать документацию для модуля Perl, установленного на вашем компьютере, с помощью утилиты perldoc. Например, perldoc HTML::LinkExtor. Обычно документация модуля начинается с примера использования модуля.

Вот немного более современная адаптация одного из примеров в документации:

#!/usr/bin/env perl

use v5.20;
use warnings;

use feature 'signatures';
no warnings 'experimental::signatures';

use autouse Carp => qw( croak );

use HTML::LinkExtor qw();
use HTTP::Tiny qw();
use URI qw();

run( $ARGV[0] );

sub run ( $url ) {
    my @images;

    my $parser = HTML::LinkExtor->new(
        sub ( $tag, %attr ) {
            return unless $tag eq 'img';
            push @images, { %attr };
            return;
        }
    );

    my $response = HTTP::Tiny->new->get( $url, {
            data_callback => sub { $parser->parse($_[0]) }
        }
    );

    unless ( $response->{success} ) {
        croak sprintf('%d: %s', $response->{status}, $response->{reason});
    }

    my $base = $response->{url};

    for my $image ( @images ) {
        say URI->new_abs( $image->{src}, $base )->as_string;

    }
}

Выход:

$ perl t.pl https://www.perl.com/
https://www.perl.com/images/site/perl-onion_20.png
https://www.perl.com/images/site/twitter_20.png
https://www.perl.com/images/site/rss_20.png
https://www.perl.com/images/site/github_light_20.png
https://www.perl.com/images/site/perl-camel.png
https://www.perl.com/images/site/perl-onion_20.png
https://www.perl.com/images/site/twitter_20.png
https://www.perl.com/images/site/rss_20.png
https://www.perl.com/images/site/github_light_20.png
https://i.creativecommons.org/l/by-nc/3.0/88x31.png
1 голос
/ 26 февраля 2011

Рассел C, вы видели начало фильма на Facebook, где Марк Цукербург использует Perl для автоматического извлечения всех фотографий из Facebook колледжа (а затем публикует их в Интернете). Я сказал: «Вот как бы я это сделал! Я бы тоже использовал Perl!» (за исключением того, что мне понадобится несколько дней, а не 2 минуты). В любом случае я бы использовал модуль WWW :: Mechanize для извлечения ссылок (или фотографий):

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 для входа в систему. Для этого смотрите документацию. Только шучу, просто спрашиваю. О боже, яблочная штурм горит!

0 голосов
/ 13 декабря 2010

Может быть, это может помочь вам:

if ($input =~ /(http:\/\/www\.facebook\.com\/\S+)/) { push(@urls, $1); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...