-3

ページからすべてのIMDBIDを取得するにはどうすればよいですか?たとえば、ここからすべてのIDを取得したいとします。そのページでは、URLの形式は次のとおりです。

http://www.imdb.com/title/tt0948470/

を使用してページからすべてのIDを取得する必要がありますpreg_match_all()-何か助けになりますか?

4

2 に答える 2

1

わかりました、私は作り上げられたコードを与えていません。Firefoxの「ビュー選択ソース」の簡単な機能により、各リンクに次の形式のhrefプロパティがあるように見えます。

href="/title/tt1615065/"

これで、正規表現を作成するのは簡単です。私はあなたに良い正規表現チュートリアルを提案します、そして非欲張りマッチは仕事をします。幸運を!

于 2012-06-28T14:56:58.133 に答える
1

さて、私は作り上げられたコードを与えていますが、それについても説明します:

  1. HTMLソースを取得する
  2. <a> hrefすべての属性を解析する
  3. それらの値が一致するかどうか、正規表現でテストします。
  4. 一致する場合は、リンクからIDを抽出し、重複しないように保存します。
  5. 終わり。

例/デモ

// initialize
$ids   = array(); 
$url   = 'http://www.imdb.com/movies-coming-soon/'; # this URL
$expr  = '//a/@href';                               # these attributes
$regex = '(/title/(tt\d{5,7})/)u';                  # matching this regex
$match = 1;                                         # take group 1

// process
foreach((new DOMXpath(@DOMDocument::loadHTMLFile($url)))->query($expr) as $obj)
    preg_match($regex, $obj->value, $matches)
      && $ids[$matches[$match]] = 0;
    ;
$ids = array_keys($ids);

// output
print_r($ids);

注:この質問にPHP5のタグを付けましたが、現在の安定したPHP5は5.4なので、この例も同様です。PHP5バージョンをcurlラッパーで構成すると、このコードは次のようになりますcurl。)

編集: PHPの下位バージョン:

...
// process
$xp = new DOMXpath(@DOMDocument::loadHTMLFile($url));
foreach($xp->query($expr) as $obj)
...

Edit2: IMDBがマークアップにタグを付けているのを見るだけなので、そのページのタイトルリンクではなく、そのリストの実際の映画エントリを取得できます。

これには、使用するxpath式を少し改善する必要があります。解析がはるかにインテリジェントになったため、重複は存在せず、それらを削除する必要はありません。

// initialize
$ids   = array();
$url   = 'http://www.imdb.com/movies-coming-soon/'; # this URL
$expr  = '//*[@itemtype="http://schema.org/Movie"]
                //a[@itemprop="url"]/@href';        # these attributes
$regex = '(/title/(tt\d{5,7})/)u';                  # matching this regex
$match = 1;                                         # take group 1

// process
$xp = new DOMXpath(@DOMDocument::loadHTMLFile($url));
foreach($xp->query($expr) as $obj)
    preg_match($regex, $obj->value, $matches)
        && $ids[] = $matches[$match];
;
于 2012-06-28T15:46:39.640 に答える