PEAK XOOPS - ジョイントを作ってみよう (1) in englishin japanese

Archive | RSS |
XOOPS
XOOPS : ジョイントを作ってみよう (1)
Poster : GIJOE on 2007-04-27 05:16:04 (7915 reads)

in englishin japanese
使い方の説明はちょっとお休みして、ジョイントの作り方を解説してみます。

他のサイトから更新データを引っ張ってきたい時、業種によってはRSSが提供されていないことも多くあるでしょう。そういうサイトでは、HTMLを解析するしかありません。

逆に言えば、d3pipesであれば、HTMLを解析するジョイントクラスだけを作ればいいのです。取得もアグリゲーションも絞り込みも保存も表示も、そのまま使えます。

※どんなサイトもRSS化する、なんてサービスもありますが、それだと細かい所に手が届きません。サイト個別に対応するなら、専用の解析ジョイントを書くのが一番です。

さっそく作ってみましょう。今回は解析ジョイントを作るので、クラス定義ファイルの置き場所は、ここになります。

XOOPS_TRUST_PATH/modules/d3pipes/joints/parse/

HTMLからヘディングをとってくるだけなので、Simplehtmlという名前にしましょう。
クラス名は、D3pipesParseSimplehtmlに、ファイル名は、D3pipesParseSimplehtml.class.php となります。
※ クラス名やファイル名は、Camel表記である点に注意が必要です。

クラスファイルの中身では、基本的にexecute()メソッドを記述するだけです。どういうデータを受け取って、どのように返すかは、ジョイントの種別によって違います。解析ジョイントの場合、テキストファイルからエントリ配列を返します。

HTMLを解析する方法にもいろいろありますが、ここでは最もシンプルに正規表現で抜き出します。いろんな抜き出しパターンがあると思われるので、パターン部分はオプションで指定できるようにしましょう。そうすれば、別のサイトにも使い回しが効くかも知れません。

最後に添付したリストを見れば、とっても簡単なことが判るはずです。各エントリに最低限必要な要素は4つです。

'heading' : 見出し
'pubtime' : 発行日時のUnixTimestamp(ここでは、簡易的に取得時間としてますが、HTML内に発行日時の情報があれば、それを解析しても良いでしょう)
'link' : その記事へのリンク(絶対URI)。ここでは定義しようがないので、あとから、Defaultlink という再割り当てジョイントを使います。もし、その記事のURI情報がHTML内にあれば、それをここで割り当てておくべきです。
'fingerprint' : 記事の唯一性を保証するための指紋です。記事が独立したURIを持っていればそれを割り当てますが、ここでは単に見出しのmd5をとってます。

新しく作ったこのジョイントを使ったパイプを構成してみましょう。
そのページの h2 に見出し一覧がある、としてます。


 0 外部から取得         snoopy      (対象サイトのURI)
10 コード変換(UTF8へ)   mbstring    (対象サイトのエンコーディング)
20 XML解析              simplehtml  #\<h2\>([^<]*)\</h2\>#iU
30 コード変換(UTF8から) mbstring    EUC-JP (内部エンコーディング)
40 再割り当て           defaultlink (対象サイトのURI)
50 ローカル保存         moduledb    86400


joints/parse/D3pipesParseSimplehtml.class.php

<?php

require_once dirname(dirname(__FILE__)).'/D3pipesParseAbstract.class.php' ;

class D3pipesParseSimplehtml extends D3pipesParseAbstract {

	function execute( $html_source , $max_entries = '' )
	{
		$items = array() ;

		preg_match_all( $this->option , $html_source , $matches , PREG_SET_ORDER ) ;
		foreach( $matches as $match ) {
			$items[] = array(
				'headline' => $match[1] ,
				'pubtime' => time() ,
				// 'link' => '' ,
				'fingerprint' => md5( $match[1] ) ,
			) ;
		}

		return $items ;
	}

}

?>

0 comments

Related articles
Printer friendly page Send this story to a friend

Comments list

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!