多重にtableを使用しているhtmlなどに対してスクレイピングするときに、深い階層のタグは検索にfilterに入れたくない場合がある。
<table id="top_table">
<tr>
<td>data1</td>
<td>data2</td>
<td>
<table>
<tr>
<td>data3-1</td>
<td>data3-2</td>
<td>data3-3</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>data1</td>
<td>data2</td>
<td>
<table>
<tr>
<td>data3-1</td>
<td>data3-2</td>
<td>data3-3</td>
</tr>
</table>
</td>
</tr>
...
</table>
filter
で頑張ってみたが出来なかったので、 filterXPath
を使ってみたら出来たのでメモ。
$top_table_tag = $crawler->filter('table#top_table');
$top_table_tag->filterXPath('./*/tr')->each(function($tr_tag) {
$child_td_tags = $tr_tag->filterXPath('./*/td');
$data1_tag = $child_td_tags->eq(0);
$data2_tag = $child_td_tags->eq(1);
$data3_tag = $child_td_tags->eq(2);
}
ちなみに、下記のようにすると直下のタグをリストできる。
filterXPath('./*/*')
filterでも $table_tag->filter('> tr')
とかできたら良いのになぁ。