simple_html_dom.phpの使い方

スクレイピング

サイトの更新チェックをする機会が(趣味で)ときどきあって、何度かこのライブラリを使ったことはあり。ただ、毎回デバッグを繰り返して結果オーライになるように強引に使っていたので、今回はちゃんと理解して(?)使ってみました。

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)->innertextbbb<b>ccc</b>
$html->find('#aaa', 0)->plaintextbbbccc

属性の取得

属性値をプロパティのように取得可能です。(下記参照)
->href
->id
->checked

PHP Simple HTML DOM Parser: Manual

全部オンラインドキュメントに書いてあるんですけどね…ともかく今後はちゃんと使えそうです。自分のようなどどどシロウトの参考になりますれば!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です