前の記事 ≪:2012年6月15日 管理人のブックマーク
次の記事 ≫:超カッコいいローディングを実現できるjQueryプラグイン「Percentage Loader...

PHPでのスクレイピングやDOM操作をjQueryっぽく超簡単便利にできる「phpQuery」

2012年06月18日-はてなブックマーク

スポンサード リンク
[PR] 英単語を忘却曲線アプリを使って超効率よく記憶する方法
phpmaster | Server-Side HTML Handling Using phpQuery

PHPでのスクレイピングやDOM操作をjQueryっぽく超簡単便利にできる「phpQuery」。
紹介記事を読んで使ってみました。

phpQuery はjQueryのPHP版でDOMの操作をjQueryっぽくできるライブラリです。
HTMLのスクレイピングはもちろん、HTMLを追加したり要素に属性を追加等のDOMを操作も簡単に行えます。
jQueryの便利さがPHP上でも十分に使えますので知っておくと確実に面倒な処理を楽に書けるようになるでしょう。

スクレイピング

HTMLのスクレイピングをする場合には超簡単かつ、jQueryを使ったことがある方なら抵抗なくすぐに習得できます。
ちょっとコードを書いて実験してみました。



と書くと <div id="two"></div>の中身である two が綺麗に取れます。
正規表現で取るとなるとイレギュラー対応などがめんどくさそうですが、これならHTMLをパースしているっぽいので<div id="two" style="">two</div> などと余計なattrが追加されていようと綺麗にとれますね

DOMの中に同じ要素が複数要素がある場合はどうでしょうか。<div class="a"> を取り出してみましょう。



ドキュメント中にある複数の要素を扱う場合は、foreachさせつつ、それを pq という関数によって一旦 phpQueryObject オブジェクトに変換してから html() などのメソッドを呼ぶようにします。
pq() は jQuery でいうところの $() です。$elem->html() とやるとphpQueryではエラーとなります。eachメソッド によるコールバックでのループも可能っぽいので興味のある人は試してみましょう。
というわけでスクレイピングは本当に簡単にできることが分かりましたね。

DOMの操作・組立

ライブラリの読込とドキュメントの生成コード。


newDocumentによってHTML要素をDOMに変換。



$doc["div"]->append() みたいに、やってますが、これはお分かりの通り、jQueryでいうところの $('div').append() と同じ。
$doc['div']は最初に<div>ドキュメントを生成しているので、$doc['div']にアクセスできているようです

次のように、attr, find メソッドでDOM要素にスタイリングするなどの操作も便利。



通常PHPでHTMLを出す時はベタ書きでそのまま書いて出すというアプローチなわけですが、phpQueryをベースとすると、div等によるDOMがあって、$doc['main']->append('htmltag'); のようにして枠に対してポコポコ当てはめていくような全くJavaScript的なHTMLの組み方になるところが興味深いところですね。

実用的なところでいくと、HTMLを特定のルールに従って書き換えた後、ブラウザに返すといったものでしょうか。
<td class="per">11</td> というような要素がHTML内に沢山あり、一括して<td class="per">内の要素に%を付けて<td class="per">11%</td>のようにして返却したいといった処理に使えます。
(負荷の面からはブラウザ上でjQueryでやった方がよいような気もしますが)

他にもjQuery風のかなりの機能が使えるというわけで、全ては紹介しきれず、すべて互換性があるわけではないかもしれませんが、興味のある方は ドキュメントを読んで遊んでみるとよさそう。
jQueryとPHPをある程度使える人にとっては学習コストが超低い点も嬉しいですね。

尚、ベンチマークなんかはとってないので重さは注意した方がいい点だとは思いますが、使い方次第ではかなり便利に使えるので知らなかった方は要チェックですね。

関連エントリ
関連の記事検索:PHP, スクレイピング
スポンサード リンク

By.KJ : 2012年06月18日 09:02 livedoor Readerで購読 Twitterに投稿

間違いの指摘をしていただける方はメール、あるいはTwitter/FBでお願いします(クリック)