Perl Regex从HTML中提取URL

时间:2010-12-12 22:48:16

标签: regex perl

这应该是一个简单的正则表达式,但我似乎无法弄明白。

有人可以提供1-liner来获取任意HTML输入的字符串,并使用HTML代码中的所有Facebook URL(匹配http://www.facebook.com)填充数组?

我不想使用任何CPAN模块,而更喜欢简单的正则表达式1-liner。

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

解释why you shouldn't parse HTML using a regular expression的必要链接。

话虽如此,试试这个快速而肮脏的解决方案:

my $html = '<a href="http://www.facebook.com/">A link!</a>';
my @links = $html =~ /<a[^>]*\shref=['"](https?:\/\/www\.facebook\.com[^"']*)["']/gis;

答案 1 :(得分:4)

HTML::LinkExtor。没有必要浪费你的生命能量(也不是我们的)试图将正则表达式用于这些类型的任务。

您可以使用perldoc实用程序阅读计算机上安装的Perl模块的文档。例如,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

答案 2 :(得分:1)

Russell C,你看过Facebook电影的开头吗,Mark Zuckerburg使用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登录。为此,请参阅文档。只是在开玩笑,请问。哦,上帝,苹果捣蛋正在燃烧!

答案 3 :(得分:0)

也许这可以帮到你:

if ($input =~ /(http:\/\/www\.facebook\.com\/\S+)/) { push(@urls, $1); }