使用perl regex,我试图刮掉网站的html,然后在下面的代码中匹配URL和版本号。不管我用了什么,它都与字符串不匹配。
要匹配的字符串:<a itemprop='downloadUrl' href='http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip'>Download Version 5.0.9</a> </p>
我需要得到字符串中形成href=值和版本号的部分。
我试过:
if($page =~ /.*<a itemprop='downloadUrl' href='(.*)' Download Version (.*)<\/a>/)
{
$url = $1;
$version = $2;$page包含如下所示的块:
<div id="plugin-description">
<p itemprop="description" class="shortdesc">
Wordfence Security is a free enterprise class security and performance plugin that makes your site up to 50 times faster and more secure. </p>
<div class="description-right">
<p class="button">
<a itemprop='downloadUrl' href='http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip'>Download Version 5.0.9</a> </p>
<meta itemprop="softwareVersion" content="5.0.9" />
<meta itemprop="fileFormat" content="application/zip" />
</div>
</div>发布于 2014-05-28 16:50:11
您的正则表达式不匹配,因为您缺少了标记的正确锚点>,并且需要在Download之前删除前面的空格。
if ($page =~ /.*<a itemprop='downloadUrl' href='(.*)'>Download Version (.*)<\/a>/)
^^备注:对于非贪婪的匹配,您应该使用?跟踪所有的.*。
发布于 2014-05-28 17:02:01
使用实际的HTML,如Mojo::DOM和Mojo::UserAgent来解析HTML。在Mojocast Episode 5上有一个关于这个框架的所有功能的8分钟的视频。
use strict;
use warnings;
use Mojo::UserAgent;
my $url = "https://wordpress.org/plugins/wordfence/";
my $ua = Mojo::UserAgent->new;
my $dom = $ua->get($url)->res->dom;
# Process all links
for my $link ($dom->find('a[itemprop=downloadUrl]')->each) {
if ($link->text =~ /Download Version (.*)/) {
print "$link->{href} -> $1";
}
}产出:
http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip -> 5.0.9注意:正则表达式中的一个缺陷是到处都在使用贪婪的匹配。您应该将所有的.*更改为.*?。
https://stackoverflow.com/questions/23917331
复制相似问题