1

我需要为变量 URL 指定的电影提取 IMDB id(例如:对于电影 300,它是 tt0416449)。我查看了此页面的页面源并提出了以下正则表达式

use LWP::Simple;
$url = "http://www.imdb.com/search/title?title=$FORM{'title'}";

if (is_success( $content = LWP::Simple::get($url) ) ) {
    print "$url is alive!\n";
} else {
    print "No movies found";
}

$code = "";

if ($content=~/<td class="number">1\.</td><td class="image"><a href="\/title\/tt[\d]{1,7}"/s) {
    $code = $1;
}

我在这一行收到内部服务器错误

$content=~/<td class="number">1\.</td><td class="image"><a href="\/title\/tt[\d]{1,7}"/s

我对 perl 很陌生,如果有人能指出我的错误,我将不胜感激。

4

3 回答 3

12

使用HTML 解析器正则表达式无法解析 HTML。

无论如何,错误的原因可能是您忘记在正则表达式中转义正斜杠。它应该如下所示:

/<td class="number">1\.<\/td><td class="image"><a href="\/title\/tt[\d]{1,7}"/s
于 2012-10-23T05:26:29.793 回答
3

Mojolicious发行版的一些工具为此类工作提供了一个非常好的界面。

长版

它的UserAgentDOMURL类的组合可以以非常健壮的方式工作:

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';
use Mojo::UserAgent;
use Mojo::URL;

# preparations
my $ua  = Mojo::UserAgent->new;
my $url = "http://www.imdb.com/search/title?title=Casino%20Royale";

# try to load the page
my $tx = $ua->get($url);

# error handling
die join ', ' => $tx->error unless $tx->success;

# extract the url
my $movie_link  = $tx->res->dom('a[href^=/title]')->first;
my $movie_url   = Mojo::URL->new($movie_link->attrs('href'));
say $movie_url->path->parts->[-1];

输出:

tt0381061

简洁版本

有趣的 one liner helper 模块ojo有助于构建一个非常短的版本:

$ perl -Mojo -E 'say g("imdb.com/search/title?title=Casino%20Royale")->dom("a[href^=/title]")->first->attrs("href") =~ m|([^/]+)/?$|'

输出:

tt0381061
于 2012-10-23T16:18:02.740 回答
0

我同意 XML 是反行编辑,因此是反 unix,但是有 AWK。

如果 awk 能做到,perl 肯定能做到。我可以生成一个列表:

curl -s 'http://www.imdb.com/find?q=300&s=all' | awk -vRS='<a|</a>' -vFS='>|"' -vID=$1 '

$NF ~ ID && /title/ { printf "%s\t", $NF; match($2, "/tt[0-9]+/"); print substr($2, RSTART+1, RLENGTH-2)}
' | uniq

将搜索字符串传递给“ID”。基本上这都是关于如何在 awk 中选择标记器,我使用<a>标签。在 perl 中应该更容易。

于 2012-10-23T06:27:30.647 回答