Windows TIPS
[PowerShell]
PowerShellで外部のRSSフィードを取得する
■
RSSは、サイトの新着情報などを配信するための標準的かつ有効な手段だ。
■
WebClientクラスとxmlプリミティブ型を利用すれば、RSSフィードへのアクセス/解析を短いコードで実現できる。
RSS(RDF Site Summary)は名前のとおり、サイト・コンテンツのサマリ情報(主に新着記事情報やニュースなど)を配信するための標準的かつ有効な手段だ。スパム・メールのはんらんなどによって、メール・ニュースなどの媒体による情報配信の効果が薄れつつある昨今、スパムとは無縁なRSSの重要性はますます高まっているともいえるだろう(RSSに関する詳細は、Insider.NETフォーラムの「サイトの更新情報を提供する標準言語RSS 」などを参照)。
本稿では、このRSSフィードをPowerShellスクリプト経由で取得し、必要な情報を抽出、HTML形式に整形したうえで、テキスト・ファイルに保存する方法について紹介する。
* 注意
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については「PowerShellをインストールする 」を参照してください。
手順1――テキスト・エディタでPowerShellのコードを入力する
まずはテキスト・エディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお「#〜」で始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントには、スクリプトの簡単な説明を入れておいた。
※ファイル:RssFeed.ps1
# パラメータとして、フィードのURL、文字コードを宣言
Param([String]$url, [String]$encoding='UTF-8')
# 指定されたURL/文字コードでRSSフィードを取得
$cli = New-Object System.Net.WebClient
$doc = [System.Text.Encoding]::GetEncoding($encoding).GetString($cli.Downlo adData($url))
# 取得したフィード情報をxml型にキャスト
$rss = [xml]$doc ……
# RSSフィードからタイトル/リンク/概要を取り出し、リストに整形
"<html><body><ul>"
foreach($item in $rss.RDF.item){
"<li><a href='" + $item.link.Trim() + "'>"
[String]$item.title + "</a></li>"
}
"</ul></body></html>"
※ サンプル・ファイルRssFeed.ps1をダウンロードするには、ここ をクリックしてください。
PowerShellスクリプトの実行ファイルは拡張子「.ps1」とする必要がある。ファイル名自体はなんでも構わないが、ここでは「RssFeed.ps1」という名前で保存しておこう。
コード全体の流れについてはリスト内のコメントをご覧いただくとして、ここで注目してほしいのは、以下の2点だ。
■1.ネットワーク上のリソースを取得するのはWebClientクラスの役割
インターネット上のコンテンツ(ここではRSSフィード)を取得するのは、.NET Frameworkで提供されているWebClientクラス(System.Net名前空間)の役割だ(WebClientクラスについては、TIPS「PowerShellを使って指定したファイルをインターネットからダウンロードする 」参照)。
本サンプル・プログラムでは、WebClientクラスのDownloadDataメソッドを利用して、指定されたURLからRSSフィードを取得している。DownloadDataメソッドは取得したデータをバイト配列として返すので、Encodingクラス(System.Text名前空間)のGetStringメソッドで、指定された文字エンコーディングに従って、文字列に変換する必要がある。Encodingオブジェクトは、EncodingクラスのGetEncodingメソッドで取得することが可能である。
この時点で、例えば次のような文字列が取得できているはずである。
<?xml version="1.0" encoding="Shift_JIS" ?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://www.wings.msn.to/">
<title>サーバサイド技術の学び舎 - WINGS</title>
<description>サーバサイド技術(JSP/サーブレット、ASP.NET...</description>
<link>http://www.wings.msn.to/</link>
<image rdf:resource="http://www.wings.msn.to/image/wings.jpg" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://www.wings.msn.to/index.php/-/A-03/978-4-7981-14 95-8/" />
……(中略)…….
</rdf:Seq>
</items>
</channel>
<image rdf:about="http://www.wings.msn.to/image/wings.jpg">
<title>サーバサイド技術の学び舎 - WINGS</title>
<url>http://www.wings.msn.to/image/wings.jpg</url>
<link>http://www.wings.msn.to/</link>
</image>
<item rdf:about="http://www.wings.msn.to/index.php/-/A-03/978-4-7981-1495- 8/">
<title>「PHPライブラリコレクション」(翔泳社)配本開始</title>
<link>http://www.wings.msn.to/index.php/-/A-03/978-4-7981-1495-8/</l ink>
<description> 定番のPEARはもちろん、...</description>
<category>書籍(PHP)</category>
<dc:creator>山田祥寛</dc:creator>
<dc:date>2008-01-24T00:00:00+09:00</dc:date>
</item>
……(中略)…….
</rdf:RDF>
■2.XMLデータを手軽に扱えるxmlプリミティブ型
上のリストを見ても分かるように、RSSフィードはXML(eXtensible Markup Language)形式で記述されたデータである。もっともPowerShellではデフォルトでxml型を用意しており、このようなXML文書をプログラム的に処理するのはさほど難しいことではない。
文字列として取得したXML文書をxml型に変換するには、先のコード内の のように文字列型からxml型にキャストを行うだけだ。これによって、文字列は内部的にパース(解析)されて、xml型として操作できるようになる。
xmlプリミティブ型によるXML文書の読み込み
取得したxml型は内部的にドキュメント・ツリー構造として扱われるので、このツリー構造に沿ってオブジェクトのプロパティにアクセスすれば、それぞれの要素/属性にアクセスできる。
例えば<rdf:RDF>要素配下の1番目の<item>要素の<title>要素にアクセスしたければ、
のように記述すればよいし、同じく<item>要素のrdf:about属性にアクセスしたければ、
と記述すればよい。要素/属性名を指定する際には、名前空間プレフィックス(要素、属性名のコロンより前の部分)は除かなければならない点に注意していただきたい。
以上を理解した上でもう一度サンプル・コードを見てみると、ここでは
<rdf:RDF>要素配下の<item>要素群を取り出し、これをforeachループで順番に処理。ループ内では、<item>要素配下の<title>/<link>/<description>要素をそれぞれ取得し、リストに整形
としているというわけだ。
なおここではRSS 1.0を前提にコードを記述しているが、RSSはバージョンによってフォーマットが大きく異なる。異なるバージョンのRSSフィードを読み込む場合には、読み込みのコードも変更する必要があるので注意してほしい。
ちなみにRSS 1.0の主要な要素については、Insider.NETフォーラムの「データベースからRSSフィード情報を生成するには? 」を参照していただきたい。
手順2――PowerShellのスクリプト・コードを実行する
ScriptControl.ps1を実行するには、PowerShellのプロンプトを開いた上で、以下のようにコマンドを実行すればよい(カレント・フォルダにスクリプトが保存されているものとする* )。第1引数は取得したいRSSフィードのURL、第2引数はフィードの文字エンコーディングである。
PS > ./RssFeed.ps1 http://www.wings.msn.to/contents/rss.php Shift_JIS > c:\rss.html
これによって、Rssfeed.ps1で取得したRSSフィードは、rss.htmlに保存される。これをブラウザから開いて、次のような結果が確認できれば成功だ。
取得したRSSフィードのファイルをブラウザで表示したところ
この記事と関連性の高い別のWindows TIPS
generated by
TechTargetジャパン
Windows Server Insider フォーラム 新着記事
キャリアアップ