楽天の商品検索結果画面のデータを該当テーブルのタグの部分だけを

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行ずつ取得したいのですが、何かいい方法ありますでしょうか?


回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2011/10/24 19:00:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント50pt

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

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

id:hopefully

エラーで怒られました。

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

の部分の

->find('tr')

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

2011/10/18 10:12:04
id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント50pt
<?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を順に入手します。

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

id:TransFreeBSD

遅ればせながら確認してみました。私の所だと、下記のfirst_child()は一つで良かったです。

$r = $html->find('#tableSarch table tbody', 0)->first_child()->first_child();

確かにこっちの方が確実ですね。

2011/10/22 13:15:20
id:tobeoscontinue

>>first_child()は一つで良かったです。

こちらでは一つだけだとtbodyの所でしたが結果オーライということで。

$r = $html->find('#tableSarch table tr', 0);

でも同じく動きました。

2011/10/22 19:33:51

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません