RSSという省略語の元になったと思われる用語は、いくつもあります。「RDF Site Summary」、「Really Simple Syndication」、「Rich Site Summary」、おそらく、まだほかにもあるでしょう。このように名前が混乱していることの背景には、こうした世俗的な技術領域を巡って、おびただしいほどの政治的な駆け引きが行われているという事情があります。RSSは、Webサイトのコンテンツの要約を配布するための、単純なXMLフォーマットです。これを使用すると、ニュース速報、Webサイトの更新、行事予定、ソフトウェアの更新、特集記事の収集、Webベースのオークションに出品された品目などを始めとする、あらゆる種類の情報を共用することができます。
RSSは、多くの情報源から得られた内容をNetcenterポータル (現在これは廃止されています) に集めるために、1999年にNetscapeによって作成されました。熱心なWebユーザーが集まるUserLandコミュニティーがRSSの初期の支持者となり、まもなくRSSはきわめて人気の高いフォーマットとなりました。この人気が高じて、RSSをさらに広い用途に役立つように改良する方法を巡る論争に発展しました。そしてこの論争が、RSS開発における分岐点をもたらしました。あるグループは、膨大な数のRDFツールおよびモジュールを利用するためにRDFに基づく手法を選択し別のグループはより簡素な手法を選択しました。前者はRSS 1.0と呼ばれ、後者はRSS 0.91と呼ばれています。つい先月、RSSの非RDFタイプの変種にあたる新バージョン (作成者たちによると、「RSS 2.0」ということになります) が登場して、この争いが再び激しさを増しました。
RSS 0.91と1.0は非常に人気が高く、多くのポータルおよびWebログで使用されています。実際、BloggingコミュニティーはRSSの重要なユーザーであり、また、RSSは現在最も立派なXML交換ネットワークのいくつかを裏で支えています。これらのネットワークは組織的に成長し、実際に、現存するXMLサービスのネットワークの中で、最も成功したものとなっています。RSSがXMLサービスであるのは、インターネット・プロトコルを介してXML情報を交換しているという理由によるものです (RSS交換の大部分は、HTTPによるRSS文書の単純なGETです)。この記事では、RSSで使用することのできる多くのPythonツールのうち、ごく一部を紹介します。RSSの技術的な概要については、他にたくさんの記事がありますので、ここでは触れません (参考文献を参照してください)。まず最初にRSSの基本的な部分をよく知り、またXMLを理解することをお勧めします。RDFを理解する必要はありません。
[私たちは、RSSを「Webサービス」というよりは「XMLサービス」であると考えています。RSSはXML記述を使用していますが、WSDLを使用していないためです。-- 編者]
Mark NottinghamのRSS.pyはRSS処理用のPythonライブラリーです。これはきわめて完成度が高く、よくできています。これを使用するにはPython 2.2とPyXML 0.7.1が必要です。インストールは簡単です。Markのホーム・ページからPythonファイルをダウンロードして、PYTHONPATH 内のどこかにコピーするだけです。
ほとんどのRSS.pyユーザーにとって、提供される2つのクラスCollectionChannel およびTrackingChannel 以外は重要ではありません。2つを比較すると、後者の方が役に立つようです。TrackingChannel は各項目のキーを索引とする、すべてのRSSデータを含むデータ構造です。CollectionChannel も類似のデータ構造ですが、RSS文書自体と同様に、TrackingChannel よりも組織化された編成になっていて、最上位のチャネル情報がURLのハッシュ値を使用して項目の詳細を指し示すようになっています。読者はおそらく、RSS.ns 構造によるユーティリティー名前空間宣言を使用することになると思います。リスト1 は、PythonニュースのRSSフィードをダウンロードおよび構文解析し、さまざまな項目から得られたすべての情報を簡単なリストの形式で印刷する、単純なスクリプトです。
リスト1: 簡単なRSS.py演習
from RSS import ns, CollectionChannel, TrackingChannel
#Create a tracking channel, which is a data structure that
#Indexes RSS data by item URL
tc = TrackingChannel()
#Returns the RSSParser instance used, which can usually be ignored
tc.parse("http://www.python.org/channews.rdf")
RSS10_TITLE = (ns.rss10, 'title')
RSS10_DESC = (ns.rss10, 'description')
#You can also use tc.keys()
items = tc.listItems()
for item in items:
#Each item is a (url, order_index) tuple
url = item[0]
print "RSS Item:", url
#Get all the data for the item as a Python dictionary
item_data = tc.getItem(item)
print "Title:", item_data.get(RSS10_TITLE, "(none)")
print "Description:", item_data.get(RSS10_DESC, "(none)")
|
私たちは、最初にTrackingChannel インスタンスを作成し、次にhttp://www.python.org/channews.rdf にあるRSSフィードから構文解析されたデータを、このインスタンスに移植しています。RSS.pyは、RSSデータのプロパティー名として、タプルを使用します。これは、XML処理の技法になじんでいない人にとっては見慣れない手法かもしれませんが、実は、オリジナルのRSSファイルの内容を忠実に表すために非常に役に立つ方法です。実際には、RSS 0.91のtitle エレメントはRSS 1.0のtitle エレメントと等価であるとは見なされません。アプリケーションで使用できるデータは十分にあるため、この区別を無視したい場合には、各タプルの名前空間部分を無視してもかまいません。ただし、基本のAPIはオリジナルのRSSファイルの構文に従っているため、この情報は失われません。このコードで私たちは、このプロパティー・データを使用して、ニュース・フィードからすべての項目を収集して表示用に使用します。特定の項目がどのようなプロパティーを持つのかを決めてかからないように配慮している点に注意してください。下記のコードを見てお分かりのように、私たちは安全な形式を使用してプロパティーを検索しています。
print "Title:", item_data.get(RSS10_TITLE, "(none)") |
こうすることにより、次の例とは異なり、プロパティーが見付からない場合にデフォルト値が提供されるようになります。
print "Title:", item_data[RSS10_TITLE] |
RSSフィードでどのようなエレメントが使用されているのか分かりませんので、このような予防措置が必要になります。リスト2 はリスト1 から得られる出力を表しています。
リスト2: リスト1の出力
$ python listing1.py
RSS Item: http://www.python.org/2.2.2/
Title: Python 2.2.2b1
Description: (none)
RSS Item: http://sf.net/projects/spambayes/
Title: spambayes project
Description: (none)
RSS Item: http://www.mems-exchange.org/software/scgi/
Title: scgi 0.5
Description: (none)
RSS Item: http://roundup.sourceforge.net/
Title: Roundup 0.4.4
Description: (none)
RSS Item: http://www.pygame.org/
Title: Pygame 1.5.3
Description: (none)
RSS Item: http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/
Title: Pyrex 0.4.4.1
Description: (none)
RSS Item: http://www.tundraware.com/Software/hb/
Title: hb 1.88
Description: (none)
RSS Item: http://www.tundraware.com/Software/abck/
Title: abck 2.2
Description: (none)
RSS Item: http://www.terra.es/personal7/inigoserna/lfm/
Title: lfm 0.9
Description: (none)
RSS Item: http://www.tundraware.com/Software/waccess/
Title: waccess 2.0
Description: (none)
RSS Item: http://www.krause-software.de/jinsitu/
Title: JinSitu 0.3
Description: (none)
RSS Item: http://www.alobbs.com/pykyra/
Title: PyKyra 0.1.0
Description: (none)
RSS Item: http://www.havenrock.com/developer/treewidgets/index.html
Title: TreeWidgets 1.0a1
Description: (none)
RSS Item: http://civil.sf.net/
Title: Civil 0.80
Description: (none)
RSS Item: http://www.stackless.com/
Title: Stackless Python Beta
Description: (none)
|
もちろん、読者が試すときには、ニュース項目が変更されていると思われますので、これとは多少異なる出力が得られるはずです。RSS.pyのチャネル・オブジェクトは、RSS情報を追加および変更するための方法も備えています。output() メソッドを使用して、結果をRSS 1.0フォーマットに戻すことができます。リスト1 で構文解析された情報を書き出して、これを試してください。python -i listing1.py を実行して、対話モードでスクリプトを開始してください。これによって出されるPythonプロンプトで、以下の例を実行してください。
>>> result = tc.output(items) >>> print result |
この結果、RSS 1.0文書が印刷されます。これを実行するには、RSS.pyバージョン0.42以降が必要です。以前のバージョンのoutput() メソッドにはバグがあります。
Mark Pilgrimは、RSSファイルを構文解析するために別のモジュールを提供しています。このモジュールは、RSS.pyが備えているすべての機能およびオプションを備えているわけではありませんが、きわめて自由度が高く、RSSの世界の雑然とした多様性に十分対応できるパーサーを提供しています。rssparser.pyページに次のような記載があります。
ほとんどのRSSフィードは欠陥だらけですよね。無効な文字、エスケープされないアンパーサンド (Bloggerフィード)、無効なエンティティー (Radioフィード)、エスケープされない無効なHTML (Registerのほとんどの時期のフィード)。また、RSS 0.9xのエレメントとRSS 1.0のエレメントを無造作に混ぜ合わせただけのもの (Movable Typeのフィード)。
さらには、Aaronのフィードのように、最先端を行きすぎているフィードもあります。彼は、記述要素には引用句を含めていますが、content:encodedエレメントにはフル・テキストを含めています (CDATA)。これは有効なRSS 1.0ではありますが、実際には (Aaronを除けば) 誰も使用していませんし、サポートするニュース収集機能もほとんどなく、多くのパーサーは、このような部分で立ち往生してしまいます。パーサーによっては、RSS 0.94の新規エレメント (guid) でまごついてしてしまうこともあります (例としては、Dave Winerのフィードを参照してください)。さらには、Jon Udellのフィードがあります。これには、彼が最近作ったfullitem エレメントが組み込まれています。
XMLとWebサービスのインターオペラビリティーが向上しているという事実を考えると、このようなことにまで配慮するのはおかしなことです。とにかく、rssparser.pyは、常軌を逸したことにまで対応できるように設計されているのです。
rssparser.pyも、インストールは非常に簡単です。Pythonファイル (「参考文献」を参照) をダウンロードし、「rssparser.py.txt」から「rssparser.py」に名前を変更し、PYTHONPATH にコピーするだけです。この際、オプションのtimeoutsocketモジュールも入手することをお勧めします。これは、Pythonのソケット操作のタイムアウトの振る舞いを改善しますので、エラーが発生した場合にRSSフィードがアプリケーション・スレッドを停止させる可能性が少なくなります。
リスト3 はリスト1 と同等のスクリプトですが、RSS.pyではなくrssparser.pyを使用しています。
リスト3: 簡単なrssparser.py演習
import rssparser
#Parse the data, returns a tuple: (data for channels, data for items)
channel, items = rssparser.parse("http://www.python.org/channews.rdf")
for item in items:
#Each item is a dictionary mapping properties to values
print "RSS Item:", item.get('link', "(none)")
print "Title:", item.get('title', "(none)")
print "Description:", item.get('description', "(none)")
|
これを見てお分かりのように、このコードのほうがはるかに単純です。RSS.pyとrssparser.pyを比較すると、前者のほうが機能が豊富で、RSSフィードからの構文情報を多く維持しています。後者は、より単純で寛容なパーサーです (RSS.pyパーサーは整形式のXMLだけしか受け入れません)。
出力はリスト2 に示したものと同じになるはずです。
RSS用のPythonツールはたくさんあり、紙面の制約上、そのすべてを扱うことはできません。現在出回っているその他のモジュールを調べてみたい場合には、Aaron SwartzのRSSツールに関するページは、検索の手始めとして便利です。RSSは、Python用に使用できる優れたモジュールが豊富に揃っているため、Pythonで簡単に使用することができます。これらのモジュールは、RSSの歴史や人気の副産物としてもたらされた、あらゆる混とんを覆い隠してくれます。読者のXMLサービスで、主としてWebサイトのための記述情報の交換を扱いたい場合には、最も成功しているこのXMLサービス・テクノロジーを採用することを、ぜひお勧めします。
来月は、SMTPを介したWebサービスをプログラミングするために、Python用のEメール・パッケージを使用する方法を説明する予定です。
- 『Python Web servicesデベロッパー』コラムの前回の記事をお読みください。
-
RSSニュース・フィードの紹介 (James Lewin著) は古い記事ですが、入門用にお勧めできます。この記事は、RSS 0.91および1.0、さらにPerlのインターフェースを扱っています。(developerWorks、2000年11月)
- XML.comにも、RSSに関する記事がいくつか掲載されています。一般的な概要については、RSS: Lightweight Web Syndication (Rael Dornfest著) をお読みください。Building a Semantic Web Site の中で、Eric van der Vlistは、きわめて実用的な例に基づいた、すばらしい技術的な概説を行っています。RSS Modularization (Leigh Dodds著) は、RSS開発における重要な局面に関する、いくつかの興味深い発言をたどっています。
- Mark NottinghamはRSS.py の作成者であり、彼のホーム・ページには、RSS Tutorial for Content Publishers and Webmasters をはじめ、ほかにも多数の便利な情報が掲載されています。
- Mark Pilgrimは「急進的自由主義」のRSSパーサーである rssparser.py の作成者です。このコードは、テキスト・ダウンロードで入手することができます。これをインストールする場合には、timeoutsocket.py も入手することをお勧めします。
- xmlrpclib.pyおよびsoaplib.pyの作成者であるFredrik Lundhは、RSSフィードからニュースを読み取るためのGUIフロントエンドを作成するためのpythonプロジェクト、The EffNews Project: Building an RSS Newsreader に携わっています。
-
Peerkat は、Pythonで書かれたリソース統合機能であり、利用者が、自分の閲覧したWebコンテンツをRSSを使用して管理するために役立ちます。
- Aaron Swartzは、すべての言語およびプラットフォーム用のRSSツールのリストを維持しています。
Mike Olson氏は、企業向けの知識管理アプリケーションのためのXMLソリューションを専門とするソフトウェア・ベンダーおよびコンサルタント会社である、Fourthought Inc. のコンサルタントであり、共同設立者です。Fourthoughtは、XMLミドルウェア用のオープン・ソース・プラットフォームである4Suite を開発しています。Olson氏の連絡先はmike.olson@fourthought.com です。

Uche Ogbuji氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのためのXMLソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthoughtでは、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである4Suiteを開発しています。Ogbuji氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。Ogbuji氏の連絡先はuche.ogbuji@fourthought.com です。