今回は「PHPでスクレイピング」のお話です。
抽出する際のセレクタ指定方法がjQueryライクで、使い勝手の良いライブラリをご紹介します。
PHP Simple HTML DOM Parser
http://simplehtmldom.sourceforge.net/
本家のページがシンプル過ぎて心配になりますが、、
めげずに下記からsimple_html_dom.phpを取得して下さい。
http://sourceforge.net/projects/simplehtmldom/files/
テストスクリプトと同一のフォルダに保存したとして、サンプルを書いていきます。
上記本家に書いてあるQuick Startを例にします。
Yahoo.co.jpのソースを取得しimgのsrcを全て取得する
1 2 3 4 5 6 |
<?php include "simple_html_dom.php"; $html = file_get_html('http://www.yahoo.co.jp/'); foreach($html->find('img') as $element){ echo $element->src . "<br>"; } |
ああ、なんて簡単なんでしょう!
この調子で色々抜き出していきます。
Yahooに接続してaのhrefを全て取得する
1 2 3 4 5 6 |
<?php include "simple_html_dom.php"; $html = file_get_html('http://www.yahoo.co.jp/'); foreach($html->find('a') as $element){ echo $element->href . "<br>"; } |
file_get_htmlでは無く、stringからDOMを作る際は下記のようにするようです。
このinnertextメソッド周りもクールだと思いませんか?
1 2 3 4 5 6 7 |
//StringからDOMを生成する $html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); //divの2目のclassをbarに設定(1は2つ目。0が一つ目) $html->find('div', 1)->class = 'bar'; //id=helloの1つ目のdivのinnertextをfooに変更 $html->find('div[id=hello]', 0)->innertext = 'foo'; echo $html; #結果は皆さんの目で確認してください |
タグを抜いたテキストだけ持ってくる
1 |
echo file_get_html('http://www.google.com/')->plaintext; |
その他セレクタ
1 2 3 4 |
$ret = $html->find('#foo'); #こんな指定とか $ret = $html->find('.foo'); #こんな指定とか $es = $html->find('ul li'); #こんな指定とか $es = $html->find('table.hello td'); #こんな指定とか |
その他マニュアルは下記参照ください。
http://simplehtmldom.sourceforge.net/manual.htm
jQueryの世界でよく見るセレクタの記述方法は一通り使えるみたいです。
取得したいHTMLパーツを簡単に取り出せそうですね!
今回は以上です。