2008年11月30日日曜日

 

【rhaco】XMLパーサ - SimpleTag

rhaco.org
rhaco-users.jp
download:rhaco[rhaco_1_6_1.zip]

rhacoについて

rhacoは非依存のPHPライブラリで、PythonフレームワークであるDjangoライクな変態フレームワークとして認知されている。
MVCを実現する機能の他に、用意されてるXMLパーサSimpleTagが便利だと有名。PHP4でも使える。

逆引きrhaco(?)13: htmlソースからpタグの内容を取り出す - rhacoアプリ開発日誌
rhacoのSimpleTagを試してみました - せつないぶろぐ
rhacoでXMLパース - 株式会社RYUS

使い方

rhacoの使い方は、ダウンロードしたファイルを展開してディレクトリごとアップロード。
ソースからディレクトリ「rhaco/」下の「Rhaco.php」を呼び出す。
(フレームワークとして使う場合は「rhaco/setup.php」にアクセスして設定する)

<?php
  require_once('rhaco/Rhaco.php');

続けてSimpleTagを呼び出す。

  require_once('rhaco/tag/model/SimpleTag.php');
// または
  Rhaco::import('tag.model.SimpleTag');

サンプル

/* SimpleTagサンプル */
<php
  Rhaco::import('tag.model.SimpleTag');
  $src = "<body><div><p>foo</p></div><div><p>bar</p></div></body>";
  $tag = new SimpleTag();
  $tag->set($src);
  $p_tags = $tag->getIn('p');
  foreach ($p_tags as $p_tag) {
    echo $p_tag->getValue();
  }
/* 出力結果 */
foobar
SimpleTagでスクレイピング - rhacoに関するメモ
SimpleTag と SimpleXML->xpath の比較 (rev3115) - gounx2の日記 - gounx2の日記
SimpleXmlとSimpleTag比較:twitterのhomeをスクレイピングしてみた。

さらに細かく指定して抽出するには以下の通り。
idやclassで抽出するには以下の関数を使う。子要素、孫要素まで取得もしてくれる。
XML記法で取得するSimpleXML関数との比較。

/* idで抽出 */
//SimpleXML
$xml->xpath('//div[@id="content"]')
// SimpleTag
getInAndParameter($tag, 'div', 'id', 'content');
/* classで抽出 */
// SimpleXML
$xml->xpath('//tr[contains(concat(" ",@class," ")," hentry ")]')
// SimpleTag
getInAndParameter($tag, 'tr', 'class', 'hentry');
/* SimpleTagを使って属性値(パラメータ)で取得する関数 */

<?php
 /**
 * タグ名 が $tagName で パラメータ名 が $parameterId で パラメータ値 が $value のタグを全て抽出する。
 * @param SimpleTag $tag 配列でも可
 * @param string $tagName 抽出条件 タグ名
 * @param string $parameterId 抽出条件 パラメータ名
 * @param string $value 抽出条件 パラメータ値
 * @param string $recursive 再帰抽出するか?
 * @param string $value_rex パラメータ値を正規表現で評価するか?
 * @return array SimpleTagの配列
 */
 function getInAndParameter($tag, $tagName, $parameterId, $value, $recursive=null, $value_rex=null) {
   if ($recursive === null) {
     $recursive = ($parameterId === 'id' ? false : true);
   }
   if ($value_rex === null) {
     $value_rex = false;
     if ($parameterId === 'class') {
       $value_rex = true;
       $value = '/(^|\s)' . $value . '($|\s)/';
     }
   }
   if (is_array($tag)) {
     $ret = array();
     foreach ($tag as $item) {
       $ret = array_merge($ret, getInAndParameter($item, $tagName, $parameterId, $value, $recursive, $value_rex));
       if (!$recursive && count($ret) === 1) break;
     }
     return $ret;
   }
   return _getInAndParameter($tag, $tagName, $parameterId, $value, $recursive, $value_rex);
 }

 function _getInAndParameter($tag, $tagName, $parameterId, $value, $recursive, $value_rex) {
   $ret = array();
   foreach ($tag->getIn($tagName) as $item) {
     if ( (!$value_rex && $item->getParameter($parameterId) === $value) || ($value_rex && preg_match($value, $item->getParameter($parameterId)))) {
       $ret[] = $item; if (!$recursive) return $ret;
     }
     $ret = array_merge($ret, _getInAndParameter($item, $tagName, $parameterId, $value, $recursive, $value_rex));
     if (!$recursive && count($ret) === 1) return $ret;
   }
   return $ret;
 }

rhacoはまだドキュメントがまとまってないようなので困るところもある。
SimpleXML関数はPHP5以降からだが、自分は気にしないのでどっちが便利か使っていこう。

関連

PHPでさくっとスクレイピングしたい。SimpleScrape - gounx2の日記
PHPでのスクレイピングに役立つライブラリ - (DxD)

ラベル:


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google