Robby on Rails: Parsing a RSS Feedthoughts.sort_by{|t| t[:topic]}.collect tag:www.robbyonrails.com,2005:TypoTypo2006-09-05T22:12:49-04:00Robby Russellurn:uuid:357ac3d901b4c877d619929bd89bbe472005-05-11T16:44:00-04:002006-09-05T22:12:49-04:00Parsing a RSS Feed<p>A friend was asking me how they could easily read a <span class="caps"><span class="caps">RSS</span></span> feed and display the last x items in their rails project. This was my quick and dirty response.</p>
<div class="typocode"><pre><code class="typocode_ruby ">
<span class="ident">require</span> <span class="punct">'</span><span class="string">rss/2.0</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">open-uri</span><span class="punct">'</span>
<span class="keyword">class </span><span class="class">RssfeedController</span> <span class="punct">&</span><span class="ident">lt</span><span class="punct">;</span> <span class="constant">ApplicationController</span>
<span class="keyword">def </span><span class="method">index</span>
<span class="ident">feed_url</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">http://www.planetrubyonrails.org/xml/rss</span><span class="punct">'</span>
<span class="ident">output</span> <span class="punct">=</span> <span class="punct">"</span><span class="string"><h1>My RSS Reader</h1></span><span class="punct">"</span>
<span class="ident">open</span><span class="punct">(</span><span class="ident">feed_url</span><span class="punct">)</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">http</span><span class="punct">|</span>
<span class="ident">response</span> <span class="punct">=</span> <span class="ident">http</span><span class="punct">.</span><span class="ident">read</span>
<span class="ident">result</span> <span class="punct">=</span> <span class="constant">RSS</span><span class="punct">::</span><span class="constant">Parser</span><span class="punct">.</span><span class="ident">parse</span><span class="punct">(</span><span class="ident">response</span><span class="punct">,</span> <span class="constant">false</span><span class="punct">)</span>
<span class="ident">output</span> <span class="punct">+=</span> <span class="punct">"</span><span class="string">Feed Title: <span class="expr">#{result.channel.title}</span><br /></span><span class="punct">"</span>
<span class="ident">result</span><span class="punct">.</span><span class="ident">items</span><span class="punct">.</span><span class="ident">each_with_index</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">item</span><span class="punct">,</span> <span class="ident">i</span><span class="punct">|</span>
<span class="ident">output</span> <span class="punct">+=</span> <span class="punct">"</span><span class="string"><span class="expr">#{i+1}</span>. <span class="expr">#{item.title}</span><br /></span><span class="punct">"</span> <span class="keyword">if</span> <span class="ident">i</span> <span class="punct">&</span><span class="ident">lt</span><span class="punct">;</span> <span class="number">10</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="ident">render_text</span> <span class="ident">output</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
</code></pre></div>
<p>Is there an easier way to do this with another <span class="caps"><span class="caps">RSS</span></span> library? I figured that the simplest method would be to just use the standard library that comes with Ruby.</p><p>A friend was asking me how they could easily read a <span class="caps"><span class="caps">RSS</span></span> feed and display the last x items in their rails project. This was my quick and dirty response.</p>
<div class="typocode"><pre><code class="typocode_ruby ">
<span class="ident">require</span> <span class="punct">'</span><span class="string">rss/2.0</span><span class="punct">'</span>
<span class="ident">require</span> <span class="punct">'</span><span class="string">open-uri</span><span class="punct">'</span>
<span class="keyword">class </span><span class="class">RssfeedController</span> <span class="punct">&</span><span class="ident">lt</span><span class="punct">;</span> <span class="constant">ApplicationController</span>
<span class="keyword">def </span><span class="method">index</span>
<span class="ident">feed_url</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">http://www.planetrubyonrails.org/xml/rss</span><span class="punct">'</span>
<span class="ident">output</span> <span class="punct">=</span> <span class="punct">"</span><span class="string"><h1>My RSS Reader</h1></span><span class="punct">"</span>
<span class="ident">open</span><span class="punct">(</span><span class="ident">feed_url</span><span class="punct">)</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">http</span><span class="punct">|</span>
<span class="ident">response</span> <span class="punct">=</span> <span class="ident">http</span><span class="punct">.</span><span class="ident">read</span>
<span class="ident">result</span> <span class="punct">=</span> <span class="constant">RSS</span><span class="punct">::</span><span class="constant">Parser</span><span class="punct">.</span><span class="ident">parse</span><span class="punct">(</span><span class="ident">response</span><span class="punct">,</span> <span class="constant">false</span><span class="punct">)</span>
<span class="ident">output</span> <span class="punct">+=</span> <span class="punct">"</span><span class="string">Feed Title: <span class="expr">#{result.channel.title}</span><br /></span><span class="punct">"</span>
<span class="ident">result</span><span class="punct">.</span><span class="ident">items</span><span class="punct">.</span><span class="ident">each_with_index</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">item</span><span class="punct">,</span> <span class="ident">i</span><span class="punct">|</span>
<span class="ident">output</span> <span class="punct">+=</span> <span class="punct">"</span><span class="string"><span class="expr">#{i+1}</span>. <span class="expr">#{item.title}</span><br /></span><span class="punct">"</span> <span class="keyword">if</span> <span class="ident">i</span> <span class="punct">&</span><span class="ident">lt</span><span class="punct">;</span> <span class="number">10</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="ident">render_text</span> <span class="ident">output</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
</code></pre></div>
<p>Is there an easier way to do this with another <span class="caps"><span class="caps">RSS</span></span> library? I figured that the simplest method would be to just use the standard library that comes with Ruby.</p>
Neil Chandlerurn:uuid:b9092c0f-d154-4618-bd12-26307ff98b2b2010-02-04T04:43:09-05:002010-02-06T07:39:12-05:00Comment on Parsing a RSS Feed by Neil Chandler<p>Just a quick update.
The last line</p>
<p>posts[0..length – 1] if posts.size > length</p>
<p>will only return posts if the rss returns a number of posts > length otherwise it returns nil</p>
<p>posts.size > length ? posts[0..length – 1] : posts</p>
<p>should be used to return all posts when the total available posts is less the length</p>blahurn:uuid:857208fa-7d66-430b-9d31-5bded49138f42006-06-03T18:45:43-04:002006-09-05T22:12:50-04:00Comment on Parsing a RSS Feed by blah<p>blah blah blah. wanna buy some erection cream?</p>