Blog personal donde guardo mis notas sobre tecnología

Crea un feed RSS 2.0 rápidamente con Python

Carlos M.

Inicio #

Si necesitas crear un feed RSS par atu sitio web, puedes crear uno muy fácilmente con el modulo de Python feedgen.

Este módulo se puede utilizar para generar fuentes web en formato ATOM y RSS. Tiene soporte para extensiones. Por ejemplo incluye, una extensión para producir Podcasts.

Instalación #

Yo la he realizado mediante pip aunque puede que tu distribución lo incluya como un paquete preconpilado

pip install feedgen

Creación del feed #

Para generar el feed, creamos un fichero python, por ejemplo genfeed.py, y simplemente se instancia la clase FeedGenerator e insertamos los datos de nuestro sitio:

fg = FeedGenerator()
fg.id("https://elblogdelazaro.org/documentacin/rss.xml")
fg.title('Documentación El Blog de Lázaro')
fg.author({'name': 'Carlos M.', 'email': 'hefistion.at.com'})
fg.link(href='https://elblogdelazaro.org', rel='alternate')
fg.icon('https://elblogdelazaro.org/documentacion/images/favicon.ico')
fg.logo('https://elblogdelazaro.org/documentacion/images/favicon.png')
fg.rights('cc-by NC 4.0')
fg.subtitle('Documentación de El Blog de Lázaro')
fg.link(href='https://elblogdelazaro.org/documentacion/', rel='self')
fg.language('es')

Generar el feed #

Me voy a centrar en generar el feed en formato RSS aunque el modulo feedgen también permite generar el feed en formato Atom, tan solo debemos de añdir anuestro añadimos a nuestro fichero feddgen.py

fg.rss_file('rss.xml')

Esto vuelca la salida al fichero rss.xml, es el nombre que me gusta a mi, tu puedes llamarlo como prefieras.

Añadir entradas al feed #

Para añadir entradas al feed lo haremos con el objeto FeedEntry

fe = fg.add_entry()
fe.id('https://elblogdelazaro.org/posts/2020-04-23-mi-nueva-configuracion-de-emacs/')
fe.title('Mi (nueva) configuración de Emacs')
fe.content('''He cambiado la forma trabajar con mi fichero de configuración
 de Emacs. Antes lo tenia en un solo fichero org. Pero esta configuración
  tenia demasiadas cosas que no entendía/necesitaba ya que cuando lo hice me
   limite a copiar y pegar de internet aquellas cosas que iba necesitando,
   incluyendo funciones y paquetes innecesarios para mi flujo de trabajo.
      ''')
fe.summary(u'''He cambiado la forma trabajar con mi fichero de configuración
 de Emacs…''')
fe.link(href='https://elblogdelazaro.org/posts/2020-04-23-mi-nueva-configuracion-de-emacs/', rel='alternate')
fe.author(name='Carlos M.', email='hefistion.at.mail.com')

Todo junto #

Veamos ahora como trabaja todo junto, fichero viene a ser el siguiente:

import sys
from feedgen.feed import FeedGenerator

USAGE = '''
Usage: python -m feedgen [OPTION]
Use one of the following options:
File options:
  <file>.rss       -- Generate RSS test teed
Stdout options:
  rss              -- Generate RSS test output
'''


def print_enc(s):
    '''Print function compatible with both python2 and python3 accepting strings
    and byte arrays.
    '''
    if sys.version_info[0] >= 3:
      print(s.decode('utf-8') if isinstance(s, bytes) else s)
    else:
      print(s)


def main():
    if len(sys.argv) != 2 or not (
	  sys.argv[1].endswith('rss')
      print(USAGE)
      exit()

    arg = sys.argv[1]

    # Feed
    fg = FeedGenerator()
    fg.id("https://elblogdelazaro.org/documentacin/rss.xml")
    fg.title('Documentación El Blog de Lázaro')
    fg.author({'name': 'Carlos M.', 'email': 'hefistion.at.com'})
    fg.link(href='https://elblogdelazaro.org', rel='alternate')
    fg.icon('https://elblogdelazaro.org/documentacion/images/favicon.ico')
    fg.logo('https://elblogdelazaro.org/documentacion/images/favicon.png')
    fg.rights('cc-by NC 4.0')
    fg.subtitle('Documentación de El Blog de Lázaro')
    fg.link(href='https://elblogdelazaro.org/documentacion/', rel='self')
    fg.language('es')

    # Entradas
    # 1
    fe = fg.add_entry()
    fe.id('https://elblogdelazaro.org/posts/2020-04-23-mi-nueva-configuracion-de-emacs/')
    fe.title('Mi (nueva) configuración de Emacs')
    fe.content('''He cambiado la forma trabajar con mi fichero de configuración
     de Emacs. Antes lo tenia en un solo fichero org. Pero esta configuración
      tenia demasiadas cosas que no entendía/necesitaba ya que cuando lo hice me
       limite a copiar y pegar de internet aquellas cosas que iba necesitando,
       incluyendo funciones y paquetes innecesarios para mi flujo de trabajo.
	  ''')
    fe.summary(u'''He cambiado la forma trabajar con mi fichero de configuración
     de Emacs…''')
    fe.link(href='https://elblogdelazaro.org/posts/2020-04-23-mi-nueva-configuracion-de-emacs/', rel='alternate')
    fe.author(name='Carlos M.', email='hefistion.at.mail.com')

    # 2
    fe = fg.add_entry()
    fe.id('https://elblogdelazaro.org/posts/2020-04-27-ocultar-usuario-libvirt-qemu-user-en-pantalla-de-login-en-linux-mint-19_3/')
    fe.title('Ocultar usuario libvirt-qemu en pantalla de login en Linux Mint 19.3')
    fe.content('''Si has instalado virt-manager en Linux Mint 19.3 y Cinnamon
    como entorno de escritorio seguramente también tendrás LightDM como gestor
    de inicio de sesión, habrás notado que en tu pantalla de inicio de sesión
    ahora tendrás a un nuevo usuario llamado **libvirt-qemu**.
	  ''')
    fe.summary(u'''Si has instalado virt-manager en Linux Mint 19.3''')
    fe.link(href='https://elblogdelazaro.org/posts/2020-04-27-ocultar-usuario-libvirt-qemu-user-en-pantalla-de-login-en-linux-mint-19_3/', rel='alternate')
    fe.author(name='Carlos M.', email='hefistion.at.gmail.com')

    # Creamos el fichero
    fg.rss_file('rss.xml')

# Imprime por pantalla
#   print_enc(fg.rss_str(pretty=True))

if __name__ == '__main__':
    main()

Espero que te haya gustado, pasa un buen día… 🐧

Referencia: #