Cada vez que toca lidiar con html pasa lo mismo: ¿nos hacemos un parseador "a palo seco" que nos sirva únicamente para esa web o nos peleamos con los módulos de pyxml?
El proceso más manual, suele ser útil para nimiedades pero cuando queremos hacer algo más o menos universal es bueno echar mano de PyXml o libxml2dom (véase más sobre libxml2dom y PyXML en el siguiente enlace: http://www.boddie.org.uk/python/HTML.html).
En esta receta vamos a ver como descargar un documento y asegurarnos de que no hay código mal formado.
1.- Para descargar un documento, el módulo urllib nos facilita mucho el trabajo. La siguiente función descarga un documento pasándole el nombre de dominio, la ruta del fichero a descargar y un fichero temporal donde almacenar los datos:
def getWebPage(nomeDominio,arquivo,fichTemporal):
'''
Descarga un documento de un site remoto. El nombre de cominio
debe de ser pasado sin http://
'''
import urllib
servidor = httplib.HTTP(nomeDominio)
servidor.putrequest('GET',arquivo)
servidor.putheader('Accept','text/html')
servidor.endheaders()
errcode, errmsh, replyheader = servidor.getreply()
if (errcode != 200):
# Significa que no se puede acceder al servicio
print errcode
descargado = 1
else:
codigoHtml = servidor.getfile()
datos = codigoHtml.readlines()
codigoHtml.close()
wTmp = open(fichTemporal,'w') # en binario wb si es un zip, jpg, etc
for line in datos:
wTmp.write(line)
wTmp.close()
descargado = 0
return descargado
2.- Recorremos el código para ordenarlo, limpiarlo y asegurarnos de que se quede sin "malformaciones". Podemos hacerlo a mano, pero existe un módulo llamado Beautiful Soup que lo hace por nosotros. (Beautiful Soup se puede descargar del siguiente enlace http://www.crummy.com/software/BeautifulSoup/#Download)
Una vez instalado podemos hacer uso de sus bondades para limpiar el código:
from BeautifulSoup import BeautifulSoup
limpiador = BeautifulSoup(variable_con_codigo_sucio)
codigo_limpio = limpiador.prettify()
Con esto ya nos queda el código perfecto para pasárselo a PyXML
23.10.07
Suscribirse a:
Entradas (Atom)