purazumakoiの[はてなブログ]

技術メモから最近はライフログも増えてきてます。

PHPでHTMLをパースする。

スクレイピングをやってみる

HTML Parserを使います。


参考リンク
HTML Parser for PHP:WEB管理者の為の総合ポータルサイトBenzo
研究開発:PHP HTML-parserの使い方 - livedoor Blog(ブログ)


今回はクックパッド(COOKPAD)の「話題のレシピ」の情報を取得します。
※クックパッドの表示系が変わったら動かなくなります。(2009/08/04動作確認済)


抽出元
COOKPAD

demo

スクレイピングテスト



ソース(UTF-8

<?php
 // ライブラリを読み込む
 require_once('../lib/htmlparser.inc');

 // まずはソースを一括取得するURLを指定 
 $parser  = HtmlParser_ForURL("http://cookpad.com/");

 // パースを行う
 while ($parser->parse()) {
    
  // 指定IDのノード発見
  // id=wadai-recipe-inner 且つ 開始タグである
  if($parser->iNodeAttributes['id'] == "wadai-recipe-inner" && $parser->iNodeType == NODE_TYPE_ELEMENT ) {
   $parentFounded = true;
  }
  // id=wadai-recipe-inner 且つ そのタグの終了タグである
  if($parser->iNodeAttributes['id'] == "wadai-recipe-inner" && $parser->iNodeType == NODE_TYPE_ENDELEMENT) {
   $parentFounded = false;
   continue; // この回のループを飛ばす。
  }
  
  // 指定IDのノード以下のノードのみの処理
  if( $parentFounded ){
  
   // 日付取得
   if($parser->iNodeAttributes['class'] == "hot font10") {
    $date = $parser->iNodeValue;
   }
   
   // テキスト取得
   if($parser->iNodeAttributes['class'] == "recipe-title") {
    $text = "<a href=\"" . $parser->iNodeAttributes['href'] . "\" target=\"_blank\">" . $parser->iNodeValue . "</a>";
   }
   
   // 【出力】
   if($date && $text) {
    print $date;
    print $text ;

    // 表示内容を初期化
    $date = "";
    $text = "";
   }

  }

 }

?>

2008/09/01 修正
【出力】のコメント部分を修正