1413537397 あるウェブサイトから特定の情報を抽出してリスト化しようと思っています。


URLを取得し読み込み、抜き出したい部分を選択することで実現したいと考え
PHPにて以下のソースを考えました。


関数部分とメインの部分はそれぞれ独立した状態では動作がとれましたが
あわせてこの記述にするとうまくいきません。
簡単に流れを云うと
一つ目の関数で元ページからの対象リンクを取得【OK】
メインの部分で$fileにファイルを読み込み【OK】
読み込んだファイルから必要箇所を抽出【NG】

最後の動作がうまくいかない状態です。
どなたかご教授お願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/10/17 18:16:37
  • 終了:2014/10/24 18:20:04

回答(1件)

id:tobeoscontinue No.1

tobeoscontinue回答回数213ベストアンサー獲得回数532014/10/19 13:10:18

selectでの$listの個数が60個ほどしかないので
$url = select(54);
とでもすれば動くと思います。

>selectでの$listの個数が60個ほどしかないので
$listの個数は一定ではないようですねぇ。失礼しました。
以下のコードで実施してみました。多少異なる部分がありますが同等です。
当方ではUTF-8を使っているのでmb_convert_encodingでコード変換しています。

<?php

function select($num) {
  $file2 = file_get_contents("http://item.rakuten.co.jp/beautyface/c/0000000170/");
  preg_match_all('/(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/s', $file2, $url2);
  $list = array();
  foreach($url2[1] as $li2)
    if(preg_match_all('/\/c\/0000000(.+?)\//s', $li2, $url2))
      $list[] = "http://item.rakuten.co.jp/beautyface/c/0000000".$url2[1][0]."/";

//  return array_slice($list, 0, $num);
  echo 'count($list)='.count($list)."\n";
  return $list[$num];
}

$url = select(54);
echo $url."\n";

$file = file_get_contents($url);
$file = mb_convert_encoding($file,"UTF-8","EUC-JP");

preg_match_all('/<td style="(.+?)<\/td>/s',  $file, $td);

foreach($td[1] as $li) {
  $name = preg_match_all('/itemnamelink">(.+?)<\/a>/s', $li, $m) ? $m[1][0] : '';
  $pri = preg_match_all('/itemprice">(.+?)&nbsp/s', $li, $m) ? $m[1][0] : '';
  $not = preg_match_all('/class="not">(.+?)<\/span>/s', $li, $m) ? $m[1][0] : '';
  echo $name.", ".$pri.", ".$not."\n";
}
--10/20 実行結果-------------------------------------------
count($list)=67
http://item.rakuten.co.jp/beautyface/c/0000000136/
, , 
, , 
, , 
【9月5日より順次発送】JILL STUART クリスタルブルーム オードパルファン 30ml, 4,265円, 
≪楽天最安に挑戦≫Chloe ロード クロエ オードトワレ (EDT) 50ml【CO800005T】, 6,014円, 在庫なし
Chloe オードパルファム (EDP) 50ml【CO800012T】, 5,870円, 在庫なし
, , 
, , 
, , 
JILL STUART ジルバイ ジルスチュアート オード トワレ 50ml, 5,445円, 
【お一人様3点まで】JILL STUART ヴァニラ ラスト オード トワレ (EDT) ロールオン 10ml【CO444425】, 2,119円, 在庫なし
Chloe LOVE クロエ オードパルファム (EDP) 50ml, 8,214円, 
, , 
, , 
, , 
≪楽天最安に挑戦≫Chloe オードトワレ (EDT) 50ml【CO800008T】, 4,914円, 在庫なし
JILL STUART ジルバイ ジルスチュアート オード トワレ 30ml, 3,722円, 
L'OCCITANE  チェリーブロッサム オードトワレ ロールタッチ 10ml, 2,445円, 在庫なし
, , 
, , 
, , 
≪楽天最安に挑戦≫Chloe オードトワレ (EDT) 75ml【CO800009T】, 5,820円, 在庫なし
【9月5日より順次発送】JILL STUART クリスタルブルーム オードパルファン 50ml, 5,807円, 
JILL STUART ヴァニラ ラスト オード パルファン 50ml, 6,261円, 
, , 
id:los19

ご解答ありがとうございます!!

仰る通りに試してみましたがやはりうまくいかないようです、、、

2014/10/20 11:12:06

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません