繁体   English   中英

Perl 从站点中提取 URI

[英]Perl Extract URI from site

在编写 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”?

谁能帮我?

我会使用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);

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]'

1500_.jpg 是图像。 您确定要在 a href 而不是

图像源?

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

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

感谢您提供此 API,它很棒,但是如何使用 Mojo::UserAgent 从此 data-old- hires ="http://ecx.images-amazon.com/images/I/61xMCAECGhL.UL1500 .jpg" 中提取 URL? 想不通

完整的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>

您需要一个哈希值一个数组:哈希值用于保持 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 ---";
}

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

如果你只需要第一个 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 来满足。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM