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ディストリビューションのいくつかのツールによって提供されます。

ロングバージョン

UserAgentDOM、および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
于 2012-10-23T16:18:02.740 に答える
0

XMLはアンチラインエディットであり、したがってアンチユニックスであることに同意しますが、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 に答える