スクレイピング
サイトの更新チェックをする機会が(趣味で)ときどきあって、何度かこのライブラリを使ったことはあり。ただ、毎回デバッグを繰り返して結果オーライになるように強引に使っていたので、今回はちゃんと理解して(?)使ってみました。
findは第2引数の有無によりオブジェクトor配列で返る
結局のところ、この一点につきます。ここで悩んでました。findの第2引数を指定しなければ配列で、指定すれば該当するインデックスの要素をDOMオブジェクトで取得できます。なので
$html->find('div')->find(expr)
は配列に対してfindしようとしているのでエラーになって
$html->find('div', 3)->find(expr)
は4番目のdiv要素オブジェクトからfindした結果が正しく返ります。
ちなみにHTML上でidは1つだけというお約束になってはいますが、ここでは関係なく第2引数の指定が必要です。
$html->find('#idname')->find(expr)
はエラーになって、
$html->find('#idname', 0)->find(expr)
はOKということです。第2引数は該当する要素について0ベースのインデックスになるので、適宜変更してください。
<div id="fuga">hoge</div>
<div id="bar">foo</div>
<div>aaa</div>
<div>bbb</div>
例えば上で2つめのdivを取得したい場合は
$html->find('#bar', 0)
$html->find('div', 2)
のどちらかで取得できます。
更新情報などのように、同じ構造の要素を複数取得したい場合には次のようにすればOKです。
foreach ($html->find(expr) as $elem) {
$elem->find(expr, 0)->innertext;
}
findの第二引数を指定しなければ配列なので、foreachで回せば各要素が$elemに入るってことですね。
テキストの取得
<div id="aaa">bbb<b>ccc</b></div>
例えば上のようなDOMツリーがあるとしたら、それぞれ下記が取得できます。
$html->find('#aaa', 0)->outertext
→ <div id="aaa">bbb<b>ccc</b></div>
$html->find('#aaa', 0)->innertext
→ bbb<b>ccc</b>
$html->find('#aaa', 0)->plaintext
→ bbbccc
属性の取得
属性値をプロパティのように取得可能です。(下記参照)
->href
->id
->checked
PHP Simple HTML DOM Parser: Manual
全部オンラインドキュメントに書いてあるんですけどね…ともかく今後はちゃんと使えそうです。自分のようなどどどシロウトの参考になりますれば!