初めて自分の家と他人の家が違う、と意識した時

PHP Simple HTML DOM Parser を使って、スクレイピングをやってみようと
試行錯誤している最中なのですが、上手く出来なくて困っています。

具体的に分からないのは、以下の点です。

--------------------------------------------------------------------

$html = file_get_html('http://...');

foreach($html->find('ここの指定方法が分かりません') as $item);
echo $item->plaintext;

--------------------------------------------------------------------

こういった場合の文字列の指定方法は、
何をどう勉強すれば理解出来るようになるのでしょうか。

具体的に教えて頂けると助かります。


また、http://www.iimy.co.jp/item/p-33969.htmlに記載されている、
「1口以上の価格」の数値をこの方法で表示させたい場合(単位の"円"を除く)、
どのような指定方法になりますか?

「class="infoBoxContents"」を含めれば指定しやすそうだと考えて、

foreach($html->find('.infoBoxContents') as $item);
echo $item->plaintext;

と記述して、ひとまずこのclassを全て表示させようとしたのですが、
表示されたのは「ポイント 0 ポイント」だけでした。

参考にしたのは以下サイトです。
[PHP Simple HTML DOM Parserの使用方法]
http://www.crystal-creation.com/web-appli/techni …

A 回答 (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";
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

まだ何故これでスクレイピングされるのか理解出来ていませんが、
おかげさまで方向性が見えましたので、早速勉強開始しました。

こちらをベストアンサーとさせて頂きます。
回答して頂いた皆さん、ありがとうございました。

お礼日時:2013/04/08 07:19

一応確認。



teraのRMTのページですよね?
んで、価格のところ(1個以上~10個以上)を取得したいんですよね?

一応、↓で結構絞り込めます。

foreach($html->find('table.infoBox') as $item) {
echo $item->plaintext . " <br>\n";
}

後は、自分で加工して、切り出すとかしたほうが楽かもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>後は、自分で加工して、切り出すとかしたほうが楽かもしれません。

試してみました。↓

foreach($html->find('table.infoBox') as $item);

$str1 = $item->plaintext;
$substr1 = substr($str1,37,3);

echo $substr1;

このようにすれば目的の数値だけを取り出せるのですが、
こうすると価格の桁数の変動などに非常に弱くなってしまいます…。

うまい加工方法などありましたら教えて下さると助かります。

お礼日時:2013/04/07 16:48

> 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に記載されている~

うん。ごめん。面倒くさくなったから他の人に任せます。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

>俺の場合は、概ね「トライアル&エラー」

挙げてくださった例だと非常にシンプルで分かりやすいのですが、
実際にリンク先サイトのソースを見てトライしてみると
まったく思い通りに抽出してくれなくて戸惑っています。

スクレイピングしたいサイトが30サイト以上あるので、
行き当たりばったりではなく、テンプレートな指定方法以外の
テクニックみたいなものが欲しかったというのもあるかもしれません。

exampleは普通に見逃していました…。
さっそく弄っています。ありがとうございます。



引き続きご回答お待ちしています。

リンク先サイトを例にした場合、文字列の指定方法はどのようなものが
最適かを教えてもらえると、参考になりとても助かります。

お礼日時:2013/04/07 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!