viernes, 13 de noviembre de 2009

Universal Feed Parser

Hace unos días, buceando por algunos blogs, he descubierto un módulo para python 2.6.4 (aprovechando que ya lo instalamos en el post anterior =) ) llamado feedparser.

Encontré varios ejemplos de su uso en aplicaciones sencillas de consola. La mayoría explicaba un ejemplo sencillo de como actualizar tu twitter desde python con este módulo pero, como no tengo twitter, pues me propuse hacer un lector rss para blogger ( MUY cutre, pero también MUY facilmente mejorable) con el fin de explicar su funcionamiento en líneas generales.

Para instalar este módulo en ubuntu no hay mas que teclear en consola

    > sudo apt-get install python-feedparser

Bajo windows podéis descarlos desde aquí

Una vez descargado no tenéis más que descomprimirlo donde más os guste y desde la línea de comandos dirigíos a la carpeta en cuestión. Una vez dentro de ella tecleáis

> setup.py install

y listo. Ya tenemos feedparser listo para ser usado desde python.

Hay poco que explicar sobre él ya que es muy sencillo de utilizar. Voy a poner aquí dos o tres ejemplos básicos para que os hagáis una pequeña idea y luego que el código hable por si mismo!

>>> import feedparser
>>> blog = feedparser.parse('http://devnewbies.blogspot.com/feeds/posts/default')
>>> blog['feed']['title']
u'Todos somos NewBies'
>>> blog.feed.link
u'http://devnewbies.blogspot.com/'
>>> blog.version
'atom10'

Sencillo a más no poder. Y no digáis que no! Aquí abajo os dejo el código para que le echéis un vistazo. Y un poco más abajo un enlace con el archivo .py y el .zip del módulo para windows. El programilla funciona tanto en windows como en Ubuntu. Espero que os sirva de algo =)



#!/usr/bin/env python
# germaNRG'09 - http://devnewbies.blogspot.com

import sys
import re

def addRss(web):
  if web[:7] != "http://": web = "http://" + web
  if web[-1:] != "/": web += "/"
  web += "feeds/posts/default"
  return web

def removeTags(html):
  inside = 0
  text = ''
  for char in html:
    if char == '<': 

      inside = 1 
      continue 
    elif (inside == 1 and char == '>'):
      inside = 0
      continue
    elif inside == 1: continue
    else: text += char
  return text

def badChars(text):
  text = re.sub(" ","\n",text)
  text = re.sub("--->","\n",text)
  text = re.sub("\\u2026","...",text)
  return text

try:
  import feedparser
except:
  print "FeedParser module is required"
  sys.exit()

page = raw_input("Introduzca la direccion de bloger: ")
blog = addRss(page)
rss = feedparser.parse(blog)
try:
  blogTitle = rss.feed.title
  blogLink = rss.feed.link
except:
  print "El blog introducido no responde. Compruebe la direccion."
  sys.exit()

blogPosts = len(rss['entries'])
if not blogPosts:
  print "Este blog no contiene entradas."
  sys.exit()

print "El blog tiene disponibles %s entradas." % blogPosts
req = raw_input("Que entrada desea leer: ")
req = int(req)

req += 1
entTitle = rss.entries[req].title
print "\n\nTitulo del blog: %s" % blogTitle
print "Entrada: %s" % entTitle
ent = rss.entries[req]
entLink = ent.link
entAuthorName = ent.author_detail.name
entAuthorMail = ent.author_detail.email
entDate = ent.updated_parsed ## Devuelve un time.struct_time
try:
  entData = ent.content[0]['value']
  plainText = removeTags(entData)
  plainText = badChars(plainText)
  noData = 0
except:
  noData = 1
  print "Autor del blog: %s" % entAuthorName
  print "Mail del autor: %s \n\n" % entAuthorMail
 

try:
  print "Contenido de la entrada:"  

  print plainText[:150]+"...\n"
  print "Para verla completa dirijase a: %s" % entLink
except:
  print "No se pudo previsualizar la entrada."
  print "Para verla online dirijase a: %s" % entLink



Descarga el programa para leer tus blogs de Blogger favoritos mas el módulo feedparser desde aquí:


      blogger.rar

germaNRG'09

3 comentarios: