来自站点的Perl Extract URI

时间:2014-08-01 14:06:01

标签: regex perl

编写Perl脚本时需要一些帮助。

我正在使用LWP库来获取网站。现在购买我需要从这个html文件中提取一个URI。

我只需要提取包含结尾“1500_.jpg”的第一个URI

我尝试使用URI :: Find,它运行得非常好。我提取了包含结尾“1500_.jpg”的所有URI,但我意识到URI的顺序不正确。

我的代码是

#!/usr/bin/perl
use strict;
use warnings;

use URI::Find;
use LWP::Simple;

my $url = 'example.com';    
my $html = get $url;

my %uris = ();

my $finder = URI::Find->new( \&callback );    
my $found = $finder->find( \$html );

my @uris =  %uris;

my @match = grep ( /1500_.jpg$/ ,@uris );
foreach my $uri (@match) {
    print "$uri\n";
}

exit();

sub callback {
    my ( $uri_url, $uri ) = @_;

    $uris{$uri}++;

    return "--- Ersetzt durch XXXXX ---";
}

如何从网站中提取第一个URI,结果是“1500_.jpg”?

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:1)

我会使用HTML::Query来完成此任务:

#!/usr/bin/env perl
use 5.012;
use warnings;
use LWP::Simple;
use HTML::Query;

my $url = 'http://example.com/url';
my $html = get $url;

my $query = HTML::Query->new( text => $html );
my @urls = map { $_->attr('href') } $query->query('a[href]')->get_elements();
@urls = grep { $_ =~ qr/1500_\.jpg$/ } @urls;

use Data::Dumper;
print Dumper(\@urls);

答案 1 :(得分:1)

1500_.jpg是一张图片。您确定要在a href而不是img src中查找该内容吗?

无论哪种方式,我建议使用Mojo::UserAgent进行此类搜索。在Mojocast Episide 5上有一个很好的8分钟介绍性视频。

以下内容从SO perl页面中提取包含sites#的所有链接:

use strict;
use warnings;

use Mojo::UserAgent;

my $url = "http://stackoverflow.com/questions/tagged/perl";

my $dom = Mojo::UserAgent->new->get($url)->res->dom;

# Process all links
for my $link ($dom->find('a[href*=sites#]')->each) {
    print "$link->{href}\n";
}

输出:

http://stackexchange.com/sites#technology
http://stackexchange.com/sites#lifearts
http://stackexchange.com/sites#culturerecreation
http://stackexchange.com/sites#science

要进行您的目标搜索,可以使用'a[href$=1500_.jpg]'

答案 2 :(得分:0)

  

1500_.jpg是一张图片。你确定你在一个href而不是

中寻找它      

img src?

     

无论哪种方式,我建议使用Mojo :: UserAgent这种类型的   搜索。有关Mojocast的8分钟精彩介绍视频   Episide 5.

     

以下内容从SO perl页面中提取所有链接   包含网站#:

感谢您使用此API,但是如何从此数据中提取URL-old-hires =“http://ecx.images-amazon.com/images/I/61xMCAECGhL.UL1500 .jpg“使用Mojo :: UserAgent?无法弄清楚

完整的HTML代码:

<ul class="a-nostyle a-horizontal list maintain-height">

            <li class="image
             item itemNo0 selected maintain-height"><span class="a-list-item">
                <span class="a-declarative" data-action="main-image-click" data-main-image-click="{}">
                    <div id="imgTagWrapperId" class="imgTagWrapper">
                        <img alt="New Summer Fashion Handmade Beaded Womens Wedge Heels Thong Sandals Shoes (4.5, apricot) data-old-hires="http://ecx.images-amazon.com/images/I/61xMCAECGhL._UL1500_.jpg"  class="a-dynamic-image  a-stretch-vertical" id="landingImage" data-a-dynamic-image="{&quot;http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY535_.jpg&quot;:[535,535],&quot;http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY575_.jpg&quot;:[575,575],&quot;http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY395_.jpg&quot;:[395,395],&quot;http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY500_.jpg&quot;:[500,500]}" style="max-width:575px;max-height:575px;">
                    </div>
                </span>
            </span></li>

答案 3 :(得分:0)

你需要一个散列一个数组:用于保持URL唯一的散列,以及用于使它们保持有序的数组。

此代码将为您执行此操作

#!/usr/bin/perl
use strict;
use warnings;

use LWP::Simple 'get';
use URI::Find;

my $url  = 'example.com';    
my $html = get $url;

my (@uris, %seen);

my $finder = URI::Find->new(\&callback);    
$finder->find(\$html);

print "$_\n" for grep  /1500_\.jpg/, @uris;

sub callback {
    my ($uri) = @_;

    push @uris, $uri unless $seen{$uri}++;
    return "--- Ersetzt durch XXXXX ---";
}

答案 4 :(得分:0)

在我看来,最好保持简单:

如果您只需要第一个uri juste,请使用简单的正则表达式:

#!/usr/bin/perl
use strict;
use warnings;

use LWP::Simple;

my $url = 'example.com';    
my $html = get $url;
my $uri = "";

if ($html =~ /a href="(.+1500_\.jpg)"/)
{
    $uri = $1;
}

print $uri;

exit();

Perl regexp已有详细记录:http://perldoc.perl.org/perlretut.html 它是一个如此强大的工具,大多数解析需求都可以用本机perl regexp覆盖。