[英]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="{"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>
您需要一个哈希值和一个数组:哈希值用于保持 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.