- 2007/12/12
- Ruby
Rubyはじめました6:RSSファイルを手軽に見つけるで、ブログのRSSファイルを見つける方法を習得したので(単にライブラリ使っただけだけど)今度は解析してみよう、ということで作ってみました。
ライブラリ rss を使う
Rubyほどの言語ならRSSを簡単に解析してくれるライブラリがあります。その名も RSS Parser 。まんまなネーミングですが、いろいろ出来るすごいやつです。
使い方は
require 'open-uri'
require 'rss'
rss = open(RSSのURI){ |file| RSS::Parser.parse(file.read) }
これだけです。
あとは、使いたいアイテムをどんどん取得していくだけ。
rss.items.each do |item| #タイトルとリンク p item.title p item.link #複数のカテゴリを展開 item.categories.each do |category| p category.content end #概要 p item.description end
こう書くととても簡単なように感じますが、実際に組んでみると複数のカテゴリがあった場合の出し方が分からなかったり、category.content と content を付けないとテキストが出力できなかったりと試行錯誤の連続。
いろいろなブログやサンプルを参考になんとかたどり着けましたが未だに以下の2点が謎です。
- 複数の子要素がある場合、item -> items / category -> categories と複数形にすればいい?
- item.title はそのままで生のテキストが出力されたけど、category に関しては<category 〜>カテゴリ名</category>とタグが付いて出力される。category.content にすると生のカテゴリ名テキストだけ出力される。なんで?
おまけ:概要の<img>タグを除去する
概要を表示させたときに<img>タグがあると邪魔なので消す事にしました。正規表現を使うと一発でラクチン。
item.description.gsub(/<img.+?>/,"")
一応作った成果物をばさらしてみる。
#!/usr/local/bin/ruby
#ライブラリ読み込み
require "cgi"
require 'open-uri'
require 'rss'
require 'net/discover'
#ヘッダ出力
cgi = CGI.new
puts cgi.header(
"type" => "text/html",
"charset" => "UTF-8"
)
#変数初期化
result = ""
rssUri = ""
errorMsg = ""
def print_items(rss)
rss.items.each do |item|
puts "#{item.title} : #{item.description}"
end
end
#入力データが空でなければ格納
if cgi["textdata"] != "" then
feeds = URI.parse(cgi["textdata"]).discover_rss
feeds.each{|l|
rssUri = l
}
if rssUri != "" then
#RSSをオープン
rss = open(rssUri){ |file| RSS::Parser.parse(file.read) }
result = "<dl>\n"
rss.items.each do |item|
#タイトルとリンクを入力
result += "<dt><a href=\"#{item.link}\">#{item.title}</a></dt>\n<dd class=\"category\">"
#複数のカテゴリを展開
item.categories.each do |category|
result += "[#{category.content}]"
end
result += "</dd>\n"
#概要を入力
result += '<dd class="description">' + item.description.gsub(/<img.+?>/,"") + '</dd>' + "\n"
end
result += "</dl>\n"
else
errorMsg = "RSSファイルが見つかりませんでした。"
end
end
print <<EOM
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<style type="text/css">
dl{
width:50%;
}
dt{
margin:1em 0 0.5em 0;
}
dd{
margin:0;
}
.category{
text-align:right;
font-size:90%;
}
.description{
border:2px solid #FFEBCD;
background-color: #FFfBeD;
padding:1em;
}
</style>
<title>RubyでブログRSSを解析して表示してみる</title>
</head>
<body>
<h1>RubyでブログRSSを解析して表示してみる</h1>
<h2>ブログURI</h2>
<form action="04.cgi" method="post">
<input type="text" name="textdata" value="">
<input type="submit" value="表示">
</form>
#{errorMsg}
<h3>仕様</h3>
<ul>
<li>RSS1.0/RSS2.0に対応</li>
<li>atomには非対応(rssライブラリのバージョンの問題)</li>
<li>descriptionに<img>タグがあった場合は除去</li>
</ul>
<h3>結果</h3>
<dl>
<dt>RSS URI</dt>
<dd>#{rssUri}</dd>
</dl>
#{result}
<p><a href="http://blog.tofu-kun.org/">ブログへ戻る</a></p>
</body>
</html>
EOM
Rubyをもっともっと勉強せねば。どういうのがRubyっぽいコーディングスタイルなのかまだつかめていない。
- Newer: 時間がいつの間にか過ぎていく
- Older: ロリポップからチカッパへ引越をした