2007年12月24日

Yahoo! Pipes で、RSS を出力してないサイトをRSS化する - Fetch Page モジュール

問題

サイトによっては未だ RSS を出力しないところも多々ある。そんなとき、お手軽に なんでもRSS 0.1b を使って RSS を出力させることができる。ただし、これまたサイトによっては利用できないこともある。 (+_+)

 

対策

そこで、Yahoo! PipesFetch Page モジュールを利用することにする。

This module fetches the source of a given web site as a string. This data can then be converted into an RSS feed or merged with other data in your Pipe using the Regex module.

というように、サイトの内容を文字列として出力するためのモジュールで、出力されたデータを元に、他のモジュールと連携して RSSのデータ形式を出力させることができる。

 

利用するモジュール

Fetch Page : 特定のサイトのページをソースとするためのモジュール。

Filter : 入力元をフィルタ。

Rename : 入力変数の名前を変更する。

Regex : 正規表現によって変換。

 

障害保健福祉研究情報システム(DINF)ホームページ の「新着」を RSS出力させる。

071224-003

 

Fetch Page モジュールの設定

Sources > Fetch Page モジュールを Pipes の右側の領域へドラッグ&ドロップする。

  • URL フィールドには、「新着」ページのアドレスを入力する。
  • Cut content from: フィールドには、抽出する範囲を指定する。この場合、「新着情報・更新履歴」から、ページの下の方にある「>Copyright」までを対象とした。

071224-004

  • Split using delimiter: フィールドには、 要素を区切るための文字列を入力する。ここでは、<p を指定したが、これは次のような理由による。

「新着」ページの「新着情報・更新履歴」付近のソースを表示させた。そうすると、pタグ要素ごとに、情報がひとつのまとまりとなっていることがわかる。

071224-005

 

Filter モジュールの設定

次に、Fetch Page の範囲内にあるデータの中で、最初の行の「新着情報・更新履歴」が不必要なので、 Operators > Filter モジュールでブロックする。

  • 表示されないようにするために、 Block をセレクトボックスから選択。
  • Rules における最初の列の値、item.content は、Fetch Page モジュールによって出力される内容が content という変数に入れらるようだから。
  • Matches regex正規表現 「^新着情報・更新履歴」を使って、行頭が「新着情報・更新履歴」を指定している。

071224-006

 

Rename モジュールの設定

Operators > Rename モジュールを利用して、Fetch Page モジュールで抽出され、content 変数に入れられた内容を RSS の出力に合わせるための、元になるデータを出力する。

  • item.content を title という変数にコピーする。
  • item.content を description という変数名に変更する。

071224-007

これを理解するためには、RSS の構造が説明されている、こちらのサイトを参考にすること。そこに書かれているように、 RSS は channel という入れ物の中に、

title

link

description

という構造があることがわかる。

ところで、Rename モジュールで出力される前のデータは、 content という名称の入れ物があるだけだった。これを RSS の出力を真似るために、上記の RSS の構造に近いものに変換することが必要となる。それを実現するために、 content を複製 (Copy As) 、または、名称の変更 (Rename) をすることによって、後のモジュールで、RSS の構造の各々において、必要となるデータのみ抽出するようにする。そのための土台を作ってくれるのが、 Rename モジュールである。

 

Regex モジュールの設定

正規表現を利用して、入力された文字列を抽出したり、変換したりする。

Rename モジュールで出力された titledescription の中身に対して、操作を適用した。各々二行づつ正規表現を適用している。

  • In Item.title
    • replace style.*>(\d{1,2}月\d{1,2}日) with $1
    • replace <.*?> with 空白 : g, m にチェック
  • In Item.description
    • replace style.*>(\d{1,2}月\d{1,2}日) with $1
    • replace (http://www.dinf.ne.jp/) with $1doc/japanese/ : g にチェック

071224-009

Item.title に対しては、不必要なタグの一部を削除して、日付を残し、HTML のタグを削除している。

Item.description に対しては、同様に不必要なタグの一部を削除し、リンクの一部を書換えている。これは、元のサイトで、相対パスで指定されているものが、Fetch Page モジュールによって不適切なパスに書換えられているために、リンクの一部を書換えた。

 

ここで使っている正規表現については、以下を参考にした。

$1 については、正規表現 [Perl講座 -Smart] の正規表現のメタ文字の一覧より、

\1 または $1 グループ化にマッチした文字列を参照

.*? については、#085 正規表現の落とし穴の「最左最長一致の原則」と、量と位置を指定する より、

最初の"と、次の"に囲まれた文字列にマッチします。最短でマッチするので、"と"の間には、別の"は有りません。

".*?"

 最短の?を省くと、最初の"と行末の"に囲まれた文字列にマッチします。
 この場合、マッチした文字列の中に何度も"が入ることも有ります。

".*"

g, s, m, i のオプションについては、正規表現 [Perl講座 -Smart] の「m//演算子のオプション一覧」を参考にした。

冗長なところがあるけれど、とりあえず動くので、これでよしとしておく。

最後に全てのパイプをつないで保存し、起動した。

0 コメント: