lunes, 24 de septiembre de 2012

Escrebendo un script que avise no email de novas entradas nun Atom [python] (Parte 1: o lector de Atom)

O Atom é un formato baseado en XML comunmente utilizado como fonte de novas, por exemplo para decatarse de cando hai novos posts nun blogue sen ter que revisalo manualmente, normalmente úsase un programa con este fin, pero nos ímos escribir ún que nolo mande o correo electrónico (esa parte do proceso realizarase na segunda parte).

A URL sobre a que faremos as probas é a de este blogue, http://hackliza.blogspot.com/feeds/posts/default.

Ímos enton a comezar polo principio, a descargar ese arquivo é descompoñelo.
A primeira parte é ben sinxela, só temos que usar urllib.urlopen e pista :P
import urllib
atom = urllib.urlopen("http://hackliza.blogspot.com/feeds/posts/default").read()

Feito isto xa temos os datos en `atom`, agora falta descompoñelos, pero como xa dixemos está baseado en XML, así que podemos usa-lo parser da librería estándar.
from xml.dom.minidom import parseString
atom = parseString(atom)

Agora só queda buscar a información interesante, que neste casos serían as entradas, contidas nas etiquetas `entry`.

entradas = atom.getElementsByTagName("entry")

Se fixeramos `len(entradas)` atoparíamonos co número de entradas do blogue (ou probablemente un número máximo entre 20 e 30).

Veña, que casi está, agora imos extraer o título e o texto de resumo... (a función getText podedes atopala no exemplo da documentación.)
def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

# Por cada entrada
for entrada in entradas:
    entrada_lida = {}

    # Lemos o título
    entrada_lida['titulo'] = getText(entrada.getElementsByTagName("title")[0].childNodes)

    # E como resumo tomamos as 10 primeiras verbas
    texto = getText(entrada.getElementsByTagName("content")[0].childNodes)
    entrada_lida['resumo'] = ' '.join(texto.split()[:10])

    entradas_lidas.append(entrada_lida)

E agora todo xunto:
target = "http://hackliza.blogspot.com/feeds/posts/default"

import urllib
from xml.dom.minidom import parseString

# Ler o texto nunha etiqueta XML
def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

# Ler os títulos e resumo de un ATOM
def read_atom(target):
    atom = urllib.urlopen(target).read()
    atom = parseString(atom)
    entradas = atom.getElementsByTagName("entry")
    entradas_lidas = []
    # Por cada entrada
    for entrada in entradas:
        entrada_lida = {}
        # Lemos o título
        entrada_lida['titulo'] = getText(entrada.getElementsByTagName("title")[0].childNodes)
        # E como resumo tomamos as 10 primeiras verbas
        texto = getText(entrada.getElementsByTagName("content")[0].childNodes)
        entrada_lida['resumo'] = ' '.join(texto.split()[:10])

        entradas_lidas.append(entrada_lida)

    return entradas_lidas

atom = read_atom(target)
for a in atom:
    print "%s - %s..." % (a['titulo'], a['resumo'])

No seguinte post veremos como levar as contas dos que xa avisamos e coma enviar as novas usando unha conta de correo ;)

No hay comentarios:

Publicar un comentario