dポイントプレゼントキャンペーン実施中!

phpのgoutteを使用して、
下記htmlのスクレイピング結果をDBに格納したいと考えています。
li部分が繰り返し部分後なっております。

■htmlのスクレイピング部分
<ul id="test">
 <li class="clearfix">
  <div class="thumbox">
   <a href="http://xxxx.co.jp" target="_blank"">
    <img src="http://xxx.co.jp/01.jpg" alt="01" class="thumb">
   </a>
  </div>
  <h4>
   みだし
  </h4>
  <p>
   文章
  </p>
 </li>

 <li>
  上記liと同じで、繰り返し。(画像ファイル、文章等は異なります。)
 </li>
</ul>


phpソースは、下記部分になります。

■スクレイピングphpソース
$crawler->filter('ul#test a')->each(function($element)
{
var_dump($element->attr('href'));
});


現状のphpソースでは、filter('ul#test a')のため、
aタグのhrefの内容しか抜き取れていません。

やりたいこととしては、
 1.aタグのhref値
 2.imgのsrc値
 3.aタグの後のhタグの見出し
 4.pタグの文章を抜く
上記4つを一回で抜き出し、後はli部分をぐるぐる回して、1~4の値を抜きたいのです。
最終的には、
 ・抜いた4つの値をDBに1行のレコードとして格納。
 ・残りのli部分も同じように繰り返す。
といったことをやりたいので、


$crawler->filter('タグ書き方)->each(function($element)
{
変数1 = 1.aタグのhref値
   変数2 = 2.imgのsrc値
   変数3 = 3.aタグの後のhタグの見出し
   変数4 = 4.pタグの文章を抜く

   DBにIns(変数1,変数2,変数3,変数4)
});

と一回の関数の中で、4つの値を取り出し、DBに放り込みたいのです。
現状、私が記述しているfilter条件では、aタグしか取り出せないのです。
どのようにソースを修正すれば、対応できるのかわかりません。

良い知恵をお持ちの方がいらっしゃいまいたら、
ご教授お願いいたします。

A 回答 (1件)

各要素がfilterメソッドを所持しているようなので更なる絞込みは容易です。



$client = new Goutte\Client;
$crawler = $client->request('GET', 'http://example.com');
$crawler->filter('ul#test>li')->each(function ($e) {
 var_dump(array(
  $e->filter('a')->attr('href'),
  $e->filter('img')->attr('src'),
  trim($e->filter('h4')->text()),
  trim($e->filter('p')->text()),
 ));
});

ちなみにこの程度のシンプルなスクレイピングであればPHPの標準クラスだけでも容易に実現出来ます。コード量も大差無いです。

$dom = new \DOMDocument;
@$dom->loadHTMLFile('http://example.com');
$xpath = new \DOMXPath($dom);
foreach ($xpath->query('//ul[@id="test"]/li') as $e) {
 var_dump(array(
  $xpath->evaluate('string(.//a/@href)', $e),
  $xpath->evaluate('string(.//img/@src)', $e),
  $xpath->evaluate('normalize-space(.//h4)', $e),
  $xpath->evaluate('normalize-space(.//p)', $e),
 ));
}

備考: http://qiita.com/mpyw/items/c0312271819baee09132
    • good
    • 0
この回答へのお礼

ありがとうございます。

頂いた情報を参考に、作成できました。

お礼日時:2014/12/28 11:37

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