Carnets de Seattle: Patchwork d'impressions et d'humeurs d'un Français expatrié puis revenu des Etats-Unis. Depuis mars 2011, ces carnets sont aussi le journal de mon combat contre la leucémie, les séquelles de la greffe de moelle osseuse et le cancer secondaire apparu en Janvier 2024...

jeudi 16 mai 2013

Parser facilement un flux Atom avec Ruby

Bon, je sais que cela ne va pas parler aux gens qui me lisent habituellement mais je ne sais pas trop bien où sauvegarder cela et comme je n'ai pas trouvé beaucoup de références sur le net...

Donc le but, c'est d'arriver à extraire, par exemple, des posts d'un blog sous forme de fichier texte, avec comme nom de fichier le titre du post. En l'occurence, c'est un truc que je cherchais à faire depuis longtemps sur Blogger, mais le seul export c'est de l'XML au format Atom.

Solution simple, écrire un petit parser xml en un langage x ou y, perl ou Ruby, mais je n'avais vraiment pas envie de me prendre la tête.

On va donc utiliser Ruby et la gem "simple-rss".

Première étape:
gem install simple-rss
 Ensuite, un petit script super simple:
require "rubygems"
require "simple-rss"
require "open-uri"
feed = "http:/feedurl
rss = SimpleRSS.parse open('feed')
rss.entries.each do |item|
     puts "#{item.title}  #{item.send('link+alternate')} #{item.content} \n"
end
 Notez que "simple-rss" déconne un peu quand on lui passe une url avec des paramêtres, auquel cas, il vaut mieux récupérer vous même votre feed, et la passer à SimpleRSS directement, ce qui est trivial.

Reste un truc intéressant, comment récupérer du contenu spécifique dans le flux atom? Bonne question.

Comment  récupérer un label particulier dans un flux RSS Blogger?


Et bien mes enfant c'est très simple, il suffit de formater son url de la façon suivante:

 http://hostname/feeds/posts/default/-/label
hostname et label sont bien évidement à configurer suivant votre cas particulier. 

 Mais, il nous manque encore un truc: on a pas tous les posts...

Comment récuperer tous les posts d'un flux RSS Blogger?


Et bien pour cela rien de plus simple, il suffit d'aller jeter un coup d'oeil dans l'API de Google, il y a beaucoup de paramètres qui peuvent nous intéresser! Dans le cas présent, par exemple, on va utiliser "max-results", mais vous pouvez aussi aller regarder les paramètres published-min, published-max et fields.

Ce qui nous donne, pour récupérer tous les posts d'un label: 

 http://hostname/feeds/posts/default/-/label?max-results=5000

Et voilà!



4 commentaires:

  1. Merci à toi pour tous ceux que ça va aider, mais c'est du chinois pour moi ! Je vais donc en rester à la bonne vieille méthode du "copier-coller" sous Word !!!

    RépondreSupprimer
  2. Bon, la version Ruby marche, mais simple-rss sort quelques warnings quand il tombe sur des caractères accentués.

    En Perl ça donne ça:

    1 (longue!) ligne:

    perl -C -MXML::Twig -E'$,=" "; XML::Twig->parse( twig_handlers => { entry => sub { say $_->field( "title"), $_->field( q{link[@rel="alternate"]}), $_->field( "content"); } }, "http://frenchgirlinseattle.blogspot.com/feeds/posts/default?prettyprint=true")'

    Ou plus propre, avec cache (option -c) pour pouvoir débogguer sans embêter le serveur http://xmltwig.org/xmltwig/examples/get_rss (j'arrive pas à formatter le code dans les commentaires)

    RépondreSupprimer
    Réponses
    1. Hello Mirod,

      Tiens, ben en fait perl c'est vraiment mon language préféré et celui dans lequel je suis le plus à l'aise, mais je trouve que dans le cas présent, l'exemple en Ruby a une simplicité presque zen, loin du fouilli plein de charactères spéciaux de perl.

      foreach item puts item.field, c'est vraiment enfantin, j'aime bien. XML::Twig a l'air sympa, ceci étant.

      Supprimer
  3. Je suis assez d'accord en fait. J'ai pondu les versions avec XML::Twig parce que bon, je suis obligé contractuellement ;--) Il y a probalement moyen de faire plus simple en Perl, avec le module qui va bien, mais c'est vrai que ta version Ruby est assez élégante.

    RépondreSupprimer

Un petit mot fait toujours plaisir!
Si vous ne savez pas quoi choisir dans la liste déroulante, choisissez "Nom/Url". L'url est optionnelle.

Search Results


Free Blogger Templates by Isnaini Dot Com and Architecture. Heavily modified beyond all recognition by Lo�c. Social icons by plugolabs.com .Powered by Blogger