人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

楽天の商品検索結果画面のデータを該当テーブルのタグの部分だけを
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行ずつ取得したいのですが、何かいい方法ありますでしょうか?




●質問者: hopefully
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● TransFreeBSD
●50ポイント

使ったことないので、マニュアル見ただけで試してもないですが。

$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に合わせて微調整していくことになりそうです。

◎質問者からの返答

エラーで怒られました。

$html->find('#tableSarch')->find('tr')

の部分の

->find('tr')

がうまく動かないですね・・


2 ● tobeoscontinue
●50ポイント
<?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",'&nbsp;'), '', 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を順に入手します。

繰り返しでもいいのですがセルの内容に一貫性がないようなので順に処理するようにしてみました。


TransFreeBSDさんのコメント
遅ればせながら確認してみました。私の所だと、下記のfirst_child()は一つで良かったです。 $r = $html->find('#tableSarch table tbody', 0)->first_child()->first_child(); 確かにこっちの方が確実ですね。

tobeoscontinueさんのコメント
>>first_child()は一つで良かったです。 こちらでは一つだけだとtbodyの所でしたが結果オーライということで。 $r = $html->find('#tableSarch table tr', 0); でも同じく動きました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ