ページからすべてのIMDBIDを取得するにはどうすればよいですか?たとえば、ここからすべてのIDを取得したいとします。そのページでは、URLの形式は次のとおりです。
http://www.imdb.com/title/tt0948470/
を使用してページからすべてのIDを取得する必要がありますpreg_match_all()
-何か助けになりますか?
わかりました、私は作り上げられたコードを与えていません。Firefoxの「ビュー選択ソース」の簡単な機能により、各リンクに次の形式のhrefプロパティがあるように見えます。
href="/title/tt1615065/"
これで、正規表現を作成するのは簡単です。私はあなたに良い正規表現チュートリアルを提案します、そして非欲張りマッチは仕事をします。幸運を!
さて、私は作り上げられたコードを与えていますが、それについても説明します:
<a>
href
すべての属性を解析する例/デモ
// 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];
;