我正在使用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”?
任何人都可以帮助我吗?
答案 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="{"http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY535_.jpg":[535,535],"http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY575_.jpg":[575,575],"http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY395_.jpg":[395,395],"http://ecx.images-amazon.com/images/I/61xMCAECGhL._UY500_.jpg":[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覆盖。