1

我正在改进一个旧脚本,该脚本为我下载了一些壁纸。我需要知道一个类别有多少页壁纸。每个链接都有页面编号作为其文本,即:

<a href="/planes-desktop-wallpapers/page/8">8</a>
<a href="/planes-desktop-wallpapers/page/9">9</a>
<a href="/planes-desktop-wallpapers/page/10">10</a>

所以我需要捕获数字十,但我对正则表达式不太熟悉,在这种情况下如何检索页数?

提前tnx!

4

2 回答 2

5

您不想HTML使用正则表达式进行解析。在这种情况下,使用正则表达式迟早会伪造您的数据。使用模块为您执行此操作会更好。

在这个例子中,我们使用HTML::TreeBuilderand List::Util。如果您想要每个类别中最高的,另一种方法是使用 TreeBuilder::XPath 查询特定部分中的所有内容。

use strict;
use warnings;
use HTML::TreeBuilder;
use List::Util qw( max );

my $data
   = '<a href="/planes-desktop-wallpapers/page/8">8</a>\n'
   . '<a href="/planes-desktop-wallpapers/page/9">9</a>\n'
   . '<a href="/planes-desktop-wallpapers/page/10">10</a>'
   ;

my $tr = HTML::TreeBuilder->new_from_content($data); 

my @vals =
     map { [ $_->attr('href'), $_->content_list ] } 
     max ( $tr->look_down( _tag => 'a') );

use Data::Dumper;
print Dumper \@vals;

__OUTPUT__
$VAR1 = [
          [
            '/planes-desktop-wallpapers/page/10',
            '10'
          ]
        ];

如果您只想要文本(数字),只需执行以下操作:

my @vals = map { $_->content_list } max ( $tr->look_down( _tag => 'a') );
于 2013-07-06T06:12:44.893 回答
3

免责声明:通常,不赞成使用正则表达式解析 HTML。看:

RegEx 匹配打开的标签,XHTML 自包含标签除外

但这看起来像是一个非常有限/简单的案例,所以要使用正则表达式,你可以使用这个:

my $string = '<a href="/planes-desktop-wallpapers/page/8">8</a>';

$string =~ /a href="\/planes-desktop-wallpapers\/page\/(\d+)">(\d+)<\/a>/;

my $pageNumber = $1;
print $pageNumber . "\n";
于 2013-07-06T04:32:22.840 回答