我需要为变量URL指定的电影提取IMDB ID(例如:对于电影300,它是tt0416449)。我查看了此page的页面源代码,并提出了以下正则表达式
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很新,如果有人能指出我的错误,我将不胜感激。
答案 0 :(得分:12)
使用an HTML parser。 Regular expressions cannot parse HTML.
无论如何,错误的原因可能是你忘了逃避你的正则表达式中的正斜杠。它应该是这样的:
/<td class="number">1\.<\/td><td class="image"><a href="\/title\/tt[\d]{1,7}"/s
答案 1 :(得分:3)
Mojolicious发行版的一些工具为这类工作提供了一个非常好的界面。
其UserAgent,DOM和URL类的组合可以非常强大的方式运行:
#!/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
有趣的单线程助手模块ojo有助于构建一个非常短的版本:
$ perl -Mojo -E 'say g("imdb.com/search/title?title=Casino%20Royale")->dom("a[href^=/title]")->first->attrs("href") =~ m|([^/]+)/?$|'
输出:
tt0381061
答案 2 :(得分: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中应该更容易。