問題
サイトによっては未だ RSS を出力しないところも多々ある。そんなとき、お手軽に なんでもRSS 0.1b を使って RSS を出力させることができる。ただし、これまたサイトによっては利用できないこともある。 (+_+)
対策
そこで、Yahoo! Pipes の Fetch 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出力させる。
Fetch Page モジュールの設定
Sources > Fetch Page モジュールを Pipes の右側の領域へドラッグ&ドロップする。
- URL フィールドには、「新着」ページのアドレスを入力する。
- Cut content from: フィールドには、抽出する範囲を指定する。この場合、「新着情報・更新履歴」から、ページの下の方にある「>Copyright」までを対象とした。
- Split using delimiter: フィールドには、 要素を区切るための文字列を入力する。ここでは、<p を指定したが、これは次のような理由による。
「新着」ページの「新着情報・更新履歴」付近のソースを表示させた。そうすると、pタグ要素ごとに、情報がひとつのまとまりとなっていることがわかる。
Filter モジュールの設定
次に、Fetch Page の範囲内にあるデータの中で、最初の行の「新着情報・更新履歴」が不必要なので、 Operators > Filter モジュールでブロックする。
- 表示されないようにするために、 Block をセレクトボックスから選択。
- Rules における最初の列の値、item.content は、Fetch Page モジュールによって出力される内容が content という変数に入れらるようだから。
- Matches regex で正規表現 「^新着情報・更新履歴」を使って、行頭が「新着情報・更新履歴」を指定している。
Rename モジュールの設定
Operators > Rename モジュールを利用して、Fetch Page モジュールで抽出され、content 変数に入れられた内容を RSS の出力に合わせるための、元になるデータを出力する。
- item.content を title という変数にコピーする。
- item.content を description という変数名に変更する。
これを理解するためには、RSS の構造が説明されている、こちらのサイトを参考にすること。そこに書かれているように、 RSS は channel という入れ物の中に、
title
link
description
という構造があることがわかる。
ところで、Rename モジュールで出力される前のデータは、 content という名称の入れ物があるだけだった。これを RSS の出力を真似るために、上記の RSS の構造に近いものに変換することが必要となる。それを実現するために、 content を複製 (Copy As) 、または、名称の変更 (Rename) をすることによって、後のモジュールで、RSS の構造の各々において、必要となるデータのみ抽出するようにする。そのための土台を作ってくれるのが、 Rename モジュールである。
Regex モジュールの設定
正規表現を利用して、入力された文字列を抽出したり、変換したりする。
Rename モジュールで出力された title と description の中身に対して、操作を適用した。各々二行づつ正規表現を適用している。
- 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 にチェック
Item.title に対しては、不必要なタグの一部を削除して、日付を残し、HTML のタグを削除している。
Item.description に対しては、同様に不必要なタグの一部を削除し、リンクの一部を書換えている。これは、元のサイトで、相対パスで指定されているものが、Fetch Page モジュールによって不適切なパスに書換えられているために、リンクの一部を書換えた。
ここで使っている正規表現については、以下を参考にした。
$1 については、正規表現 [Perl講座 -Smart] の正規表現のメタ文字の一覧より、
\1 または $1 グループ化にマッチした文字列を参照
.*? については、#085 正規表現の落とし穴の「最左最長一致の原則」と、量と位置を指定する より、
最初の"と、次の"に囲まれた文字列にマッチします。最短でマッチするので、"と"の間には、別の"は有りません。
".*?"
最短の?を省くと、最初の"と行末の"に囲まれた文字列にマッチします。
この場合、マッチした文字列の中に何度も"が入ることも有ります。".*"
g, s, m, i のオプションについては、正規表現 [Perl講座 -Smart] の「m//演算子のオプション一覧」を参考にした。
冗長なところがあるけれど、とりあえず動くので、これでよしとしておく。
最後に全てのパイプをつないで保存し、起動した。
0 コメント:
コメントを投稿