たかまるブログ

Goutteでnodeの要素があるか確認

      2016/01/29

Goutteは指定したnodeが見つからないときに例外を投げます。
これはfilter()で絞ったあとに count() をすればnodeの数が返ってくるので判断がつくようです。

例えばこのようなテーブルがあったとき

<table id="example-table">
  <tr>
    <th>label</th>
    <th>label</th>
  </tr>
  <tr>
    <td>data</td>
    <td>data</td>
  </tr>
  <tr>
    <td>data</td>
    <td>data</td>
  </tr>
</table>

 
こうすると td の部分だけ取れます。

require_once __DIR__ . '/vendor/autoload.php';
use Goutte\Client;

$client = new Client();
$page = $client->request( "GET", "http://example.com" );

$items = [];
$page->filter( "#example-table" )->filter( "tr" )->each( function( $tr ) use ( &$items ) {
    // td を持っているか
    if ( $tr->filter( "td" )->count() ) {
        $item = array();
        $item[] = trim( $tr->filter( "td" )->eq(0)->text() );
        $item[] = trim( $tr->filter( "td" )->eq(1)->text() );
        $items[] = $item;
    }
});
print_r( $items );

 
出力結果

Array
(
    [0] => Array
        (
            [0] => data
            [1] => data
        )

    [1] => Array
        (
            [0] => data
            [1] => data
        )

)

 - php