simple_html_dom.php で切り取り
さらにその中にあるテーブルのセル単位にデータを切り取りしたいのですが
何かいい方法知りませんでしょうか?
例えば、以下のような画面で、
http://search.rakuten.co.jp/search/mall/%E3%81%8B%E3%81%BE%E3%81%BC%E3%81%93/-/f.0-p.1-s.1-sf.0-st.A-v.2
simple_html_dom.php を使い、DIV id="tableSarch"
のデータを抜き出して、さらにその中のデータを
1行ずつ取得したいのですが、何かいい方法ありますでしょうか?
使ったことないので、マニュアル見ただけで試してもないですが。
$html = file_get_html('http://search.rakuten.co.jp/search/mall/ほげほげ'); foreach($html->find('#tableSarch')->find('tr') as $tr) { if(isset($tr->id)) continue; foreach($tr->find('td') as $td) { $item = $td->plaintext; } }
[追記]
すみません。
$html->find('#tableSarch')->find('tr')
を
$html->find('#tableSarch',0)->find('tr')
または
$html->find('#tableSarch tr')
でもいけると思いますしたが、テーブルがネストしてますね...
$html->find('#tableSarch',0)->children()
もしくは
$html->find('#tableSarch',0)->children(0)->children()
のどちらかになりそうです。あと
$tr->find('td')
も
$tr->children()
になります。
あと列ごとに取捨選択するならば内側はforeachで回さない方が良いかもしれませんね。
$html = file_get_html('http://search.rakuten.co.jp/search/mall/ほげほげ'); foreach($html->find('#tableSarch',0)->children() as $tr) { if(isset($tr->id)) continue; $tds = $tr->children(); $image = $td[0]->find('img',0)->src; $name = $td[1]->plaintext; }
こんな感じで、あとは実際のHTMLに合わせて微調整していくことになりそうです。
<?php include_once "simple_html_dom.php"; define('CR',"\n"); $html = file_get_html("f.0-p.1-s.1-sf.0-st.A-v.2.html"); $r = $html->find('#tableSarch table tbody', 0)->first_child()->first_child(); while($r = $r->nextSibling()) { $c = $r->first_child(); // 1 写真 echo $c->find('img',0)->src.CR; $c = $c->nextSibling(); // 2 商品名 echo str_replace(array("\r","\n","\t",' '), '', ltrim(rtrim($c->text()))).CR; $c = $c->nextSibling(); // 3 価格 echo str_replace(array("\r","\n","\t"), '', $c->text()).CR; $c = $c->nextSibling(); // 4 ショップ名 echo ltrim(rtrim($c->text())).CR; $c = $c->nextSibling(); // 5 配送情報 echo $c->text().CR; $c = $c->nextSibling(); // 6 比較 echo $c->text().CR; } ?>
find()だけではノイズを拾ってしまうのでnextSibling()を使って手動でやってみました。
$html->find('#tableSarch table tbody', 0)->first_child()->first_child();
で最初のtrを入手します。後は$r->nextSibling()する度に次のtrとなります。
$r->first_child()で最初のtdを入手し、c->nextSibling()で次のtdを順に入手します。
繰り返しでもいいのですがセルの内容に一貫性がないようなので順に処理するようにしてみました。
遅ればせながら確認してみました。私の所だと、下記のfirst_child()は一つで良かったです。
$r = $html->find('#tableSarch table tbody', 0)->first_child()->first_child();
確かにこっちの方が確実ですね。
>>first_child()は一つで良かったです。
こちらでは一つだけだとtbodyの所でしたが結果オーライということで。
$r = $html->find('#tableSarch table tr', 0);
でも同じく動きました。
エラーで怒られました。
$html->find('#tableSarch')->find('tr')
の部分の
->find('tr')
がうまく動かないですね・・