23.10.07

Tratando HTML con Python

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