使用perl正则表达式,我正在尝试抓取网站的html,然后在以下代码中匹配URL和版本号。无论我使用什么,它都不匹配字符串。
要匹配的字符串:
<a itemprop='downloadUrl' href='http://downloads.wordpress.org/plugin/wordfence.5.0.9.zip'>Download Version 5.0.9</a> </p>
我需要获取形成href = value和Version number的字符串部分。
我试过了:
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>
答案 0 :(得分:3)
您的正则表达式不匹配,因为您错过了标记的正确锚点>
,并且需要在Download
之前删除前导空格。
if ($page =~ /.*<a itemprop='downloadUrl' href='(.*)'>Download Version (.*)<\/a>/)
^^
注意:对于非贪婪匹配,您应该使用.*
?
跟踪所有内容。
答案 1 :(得分:1)
使用实际的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
注意:你的正则表达式中的一个缺陷是你在任何地方使用贪婪的匹配。您应该将所有.*
更改为.*?
。