• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPスクレイピングが上手くいきません)

PHPスクレイピングできない!勉強方法と指定方法

このQ&Aのポイント
  • PHP Simple HTML DOM Parser を使って、スクレイピングをやってみようと試行錯誤している最中なのですが、上手く出来なくて困っています。
  • 具体的に分からないのは、文字列の指定方法や価格の表示方法です。
  • どのように勉強すれば理解できるか、指定方法や表示方法について教えて頂けると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

文字数固定の決め撃ちはやめたほうがいいですね。 下記は とりあえず、今回のケースでのみ動くという程度のもの。 正直、俺は正規表現を良く知らないので、もっといいやり方があると思う。 foreach($html->find('table.infoBox') as $item); $str = $item->plaintext; $DimData = explode(" " , trim($str)); foreach($DimData as $i => $dat) { list($num , $price) = mb_split("個" , $dat); $price = preg_replace("/[^0-9]/" , "" , $price); print "$num 個 $price 円<br>\n"; }

machahiko00
質問者

お礼

ご回答ありがとうございます。 まだ何故これでスクレイピングされるのか理解出来ていませんが、 おかげさまで方向性が見えましたので、早速勉強開始しました。 こちらをベストアンサーとさせて頂きます。 回答して頂いた皆さん、ありがとうございました。

その他の回答 (2)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

一応確認。 teraのRMTのページですよね? んで、価格のところ(1個以上~10個以上)を取得したいんですよね? 一応、↓で結構絞り込めます。 foreach($html->find('table.infoBox') as $item) { echo $item->plaintext . " <br>\n"; } 後は、自分で加工して、切り出すとかしたほうが楽かもしれません。

machahiko00
質問者

お礼

ご回答ありがとうございます。 >後は、自分で加工して、切り出すとかしたほうが楽かもしれません。 試してみました。↓ foreach($html->find('table.infoBox') as $item); $str1 = $item->plaintext; $substr1 = substr($str1,37,3); echo $substr1; このようにすれば目的の数値だけを取り出せるのですが、 こうすると価格の桁数の変動などに非常に弱くなってしまいます…。 うまい加工方法などありましたら教えて下さると助かります。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

> foreach($html->find('ここの指定方法が分かりません') as $item); んー。。。正直、そちらが参考にしたサイトに書いてあるとおりです。 $item->plaintext だと「ここの指定方法が分かりません」の部分に、取り出したいHTMLタグを指定すれば、そのタグで囲まれた部分のテキストが取れてきます。 以下は俺が試してみたもの。 ○ hoge.php ------------------ <?php include_once('../simple_html_dom.php'); $html = file_get_html('./hk.htm'); foreach($html->find('div[id]') as $item) { echo $item->plaintext . "<br>\n"; } ?> ------------------ ○ hk.htm ------------------ <html> <body> <div id=hk>残念。</div> <div>それは私の</div> <div id=oi>おいなりさんだ</div> </body> </html> ------------------ 俺が試してみたものは、「DIV で ID のあるもの」という条件でスクレイピングしているから、元々のHTMLとPHPでスクレイピングしたものでは、表示が変わる。 HTMLのほうの「それは私の」の部分は IDを指定していないから、スクレイピングのほうではスルーされる。 ↓これを foreach($html->find('div[id]') as $item) { ↓こう変更すると、 foreach($html->find('div[id=oi]') as $item) { 「おいなりさんだ」しか表示しなくなります。 > 何をどう勉強すれば理解出来るようになるのでしょうか。 俺の場合は、概ね「トライアル&エラー」 日本語で言ったほうが短くて済む「試行錯誤」 幸い この PHP Simple HTML DOM Parser には、丁寧に example がついてた。 確実に動くサンプルがあるんだから、それを自分でいじってみて、何がどう変わるか見て、それで覚える感じですかね。 > また、http://www.iimy.co.jp/item/p-33969.htmlに記載されている~ うん。ごめん。面倒くさくなったから他の人に任せます。

machahiko00
質問者

お礼

回答、ありがとうございます。 >俺の場合は、概ね「トライアル&エラー」 挙げてくださった例だと非常にシンプルで分かりやすいのですが、 実際にリンク先サイトのソースを見てトライしてみると まったく思い通りに抽出してくれなくて戸惑っています。 スクレイピングしたいサイトが30サイト以上あるので、 行き当たりばったりではなく、テンプレートな指定方法以外の テクニックみたいなものが欲しかったというのもあるかもしれません。 exampleは普通に見逃していました…。 さっそく弄っています。ありがとうございます。 引き続きご回答お待ちしています。 リンク先サイトを例にした場合、文字列の指定方法はどのようなものが 最適かを教えてもらえると、参考になりとても助かります。

関連するQ&A