Home > Ruby > Rubyはじめました7:RSSをさくっと解析して表示する

Rubyはじめました7:RSSをさくっと解析して表示する

  • Posted by: zaru
  • 2007年12月12日 19:17
  • 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点が謎です。

  1. 複数の子要素がある場合、item -> items / category -> categories と複数形にすればいい?
  2. 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っぽいコーディングスタイルなのかまだつかめていない。

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://blog.tofu-kun.org/mt-tb.cgi/359
Listed below are links to weblogs that reference
Rubyはじめました7:RSSをさくっと解析して表示する from Webプログラマー+WebデザイナーなZARU日記

Home > Ruby > Rubyはじめました7:RSSをさくっと解析して表示する

Profile

zaru

Name : zaru

Webプログラマ+Webデザイナで、Webディレクタやってます。Twitterやっているので、ぜひフォローしてやってくださいませ。Twitter - zaru。また、そのほかのプロフィールについては、iddy - zaruを見てください。

Search
Feeds
Others

Return to page top