Lire un flux RSS avec Ruby on Rails

J’ai récemment eu besoin d’intégrer les données d’un flux RSS dans 36000.fr, Ruby nous facilite tellement la tâche que c’est presque trop simple…

Lecture du flux

Commençons par ajouter les bibliothèques utilisées :

require 'rss'
require 'open-uri'

Voici un exemple de code qui va récupérer les informations dans le fichier RSS et préparer une chaine pour l’affichage :

feed_url = "http://www.url_du_flux"
output = "<h1>Lecture d'un flux RSS</h1>"
open(feed_url) do |http|
  response = http.read
  result = RSS::Parser.parse(response, false)
  output += "Titre du flux : #{result.channel.title}<br />"
  result.items.each_with_index do |item, i|
    output += "#{i+1}. #{item.title}<br />" if i < 10
  end
end

Explications :

  • feed_url est bien sûr l’adresse du flux
  • output est une chaine qui contiendra le code à afficher dans notre page web

On commence par lire le flux avec http.read puis on le parse avec RSS::Parser.parse, cette étape permet de transformer le flux en un objet simple d’utilisation, par exemple, pour obtenir le titre du flux, un result.channel.title suffit.

Ce n’est pas plus compliqué que ça et de plus il existe un tutoriel en anglais pour RSS Parser si vous voulez approfondir.

Mise en cache

Pourquoi pas utiliser le petit système de cache que j’ai présenté dernièrement ? Voici comment faire :

if CachedItem.check_for("RSS")
  # Disponible depuis le cache
  flux_rss = CachedItem.get_cached("RSS")
else
  feed_url = "http://www.url_du_flux..."
  open(feed_url) do |http|
    flux_rss = http.read
    flux_rss = RSS::Parser.parse(flux_rss, false)
    CachedItem.store_data("RSS", flux_rss)
  end
end

On commence par vérifier si le flux à déjà été parsé récemment et si ce n’est pas le cas, on le récupère et on le stocke dans le cache.

Je me suis inspiré d’un article de Robby pour le sujet de ce billet.

3 commentaires ↓

#1 bbnnt on 06.25.07 at 10:33

Tombé sur ton article apres qq recherches, je me demandais comment lire par ce biais ou simple rss l’attribu d’un element, a savoir une valeur du type <enclosure url="urlimage.qqchose" />, tuojours dasn le but d’afficher justement cette url, ou bien encore de recuperer cette valeur et de la placer dans des balises img.

#2 Stéphane on 06.25.07 at 15:03

Je viens de faire quelques essais : l’accès à un attribut se fait de la même façon qu’à un élément, ex avec mon flux rss :
<channel rdf:about= »http://www.sbnet.fr/blog/index.php/ »>
<title>Le blog SBNET</title>
<description />

un simple puts result.channel.about.to_s permet d’afficher le about

#3 christian6470 on 08.04.07 at 20:37

<ul>
<li> <%=@result5.channel.title%></:li>
<li><%=link_to(image_tag(@result5.channel.image.url.to_s, :border => 1,:title =>@result5.channel.description),@result5.channel.link)%>

<%= @result5.channel.link%>
<h6 style="font-size:8pt; color:#804000">
<%=@result5.items.size%> items Date : <%=@result5.channel.pubDate%></:li>
</h6>
<% total = 0%>

<% @result5.items.size .times do %>
<li><%= link_to @result5.items[total].title, @result5.items[total].link%></li>
<% i=0%>

<% if @result5.items[total].enclosure !=nil%>
<li><%=link_to(image_tag(@result5.items[total].enclosure.url.to_s, :border => 1,:title =>@result5.items[total].description),@result5.items[total].link)%></li>
<% end %>

<% total = total + 1 %>
<% end %>

</ul>

def rss1
$fichier_xml = "http://www.lemonde.fr/rss/sequen...
response = open( $fichier_xml)
xml1 = response.read
@result5 = RSS::Parser.parse(xml1, false)
end
je complète avec la page web qui va afficher les items du flux
içi exemple d’un flux RSS du journal Le Monde

Laisser un commentaire