En Python tenemos disponible HTMLParser, esta no debe ser confundida con la clase del mismo nombre del módulo htmllib, ya que el primero forma parte de la librería estándar, cuando obtenemos un documento de Tidy podemos utilizar HMTLParser para poder recorrer su contenido.
Utilizando HTMLParser
Utilizar el HTMLParser, realmente significa hacer subclases de él, de forma que podamos sobrescribir los métodos a nuestra conveniencia y así poder cumplir nuestros requerimientos, veamos a continuación un listado de los métodos principales que obtenemos al utilizar HTMLParser.
- handle_starttag(tag, attrs): Cuando una etiqueta de inicio es encontrada attrs es una secuencia de pares (nombre, valor).
- handle_startendtag(tag, attrs): Se utiliza para etiquetas vacías. Por defecto maneja el inicio y el cierre de forma separada.
- handle_endtag(tag): Se utiliza cuando se encuentra una etiqueta de cierre.
- handle_data(data): Se utiliza cuando encontramos data textual.
- handle_charref(ref): Se utiliza cuando trabajamos con referencias de caracteres de la forma &#ref;.
- handle_entityref(name): Lo utilizamos cuando tenemos referencias a entidades de la forma &name;.
- handle_comment(data): Solo es llamado cuando existe contenido comentado.
- handle_decl(decl): Se utiliza para las declaraciones de la forma <!...>.
- handle_pi(data): Se utiliza para procesar instrucciones.
Lo primero que notamos es que para este Screen Scraping no vamos a utilizar Tidy, esto es debido a que el HTML que vamos a inspeccionar no está mal formado, luego vemos que lo primero que declaramos son unas variables booleanas con las cuales llevaremos el control de si estamos dentro de un elemento H4 o dentro de un elemento de enlace o link.
Tenemos algo en particular con el método handle_data, como estamos en un ambiente de la vida real debemos prepararnos para los escenarios más complejos y con esto nos referimos a que como es casi seguro que no obtendremos la información necesaria a la primera llamada, preparamos este método para poder obtenerla por partes, una vez que obtenemos todo lo que hacemos es unir los datos.
La acción de nuestro programa empieza cuando llamamos al método feed() al cual le pasamos el texto que es el contenido de la página web que obtenemos con el método urlopen() y cuando todo esto ha sido procesado procedemos a llamar al método close().
Finalmente con esto logramos un programa de Screen Scraping mas legible que utilizando expresiones regulares y un poco más robusto en el aspecto que no nos limitamos a estructuras fijas, con ello podremos obtener nuestra información correctamente.
Con esto finalizamos nuestro tutorial de HTMLParser, cómo podemos ver existen muchas formas de llegar a estas soluciones, para así obtener la información de una página web.