Trabajando con BeautifulSoup en Python

En esta entrada voy a exponer cómo extraer información de una Web, utilizando Python. Empezamos por la instalación, y a continuación, un sencillo ejemplo.

Instalando BeautifulSoup

Para trabajar con HTML, una de las opciones más interesantes es BeautifulSoup, así que … vamos a instalarlo.

Instalando BeautifulSoup

Instalando BeautifulSoup

Puedes comprobar que con pip no he sido capaz de instalarlo, mientras que se ha instalado correctamente con easy_install. Ahora confirmamos que funciona.

BeautifulSoup

BeautifulSoup

NOTA: No voy a hacer un tutorial sobre BeautifulSoap, sino cómo utilizar esta librería para solventar un problema concreto!

Haciendo pruebas con BeautifulSoup

Para trabajar con BeautifulSoup, vamos a hacer uso de todo lo que se explicó en extraer código HTML desde Python. Además, vamos a hacer uso de una de las páginas que hicimos de ejemplo donde usamos Twitter Bootstrap para listas y tablas.

El objetivo inicial es recuperar los textos de la tabla.

El objetivo:

Tablas con Twitter Bootstrap

Tablas con Twitter Bootstrap

El código completo es:

def probandoBS():<br />codigoHTML = gethtml(url) # Recupero el código HTML<br />soap = bs(codigoHTML)       # Paso el código HTML a BeautifulSoap<br />#print soap.title<br />#print soap.title.string # findAll('title')<br />tabla = soap.find('table')<br />trs = tabla.findAll('tr')<br />for tr in trs:<br />tds = tr.findAll('td')<br />#print tds<br />#        for td in tds: # Imprime cada TD por separado<br />#            print td.string<br />lista = soap.findAll("ul", { "class" : "nav nav-pills" })<br />print len(lista)<br />for li in lista[0]: # Seleccionamos el primer elemento<br />print li.string

Explicamos con detenimiento el código. Tras recuperar el código HTML, pasamos dicho código a BeautifulSoup, en una variable llamada soap (línea 3). Para recuperar el title de la página (línea 4), basta con poner:

soap.title

Si sólo queremos la cadena de texto, le incluimos .string tal que así:

soap.title.string

Para recuperar el contenido de la tabla, buscamos un atributo llamado “table“:

tabla = soap.find('table')

Lo almacenamos en la variable tabla, y podemos comprobar cómo el contenido de esa variable coincide con el código HTML de dicha tabla.

El siguiente paso separar las distintas filas de la tabla, buscanto todas las etiquetas tr, mediante:

trs = tabla.findAll('tr')

El resultado es una lista con los códigos HTML de cada tr. Ahora recorremos las distintas filas, y separamos en cada fila según la casilla, que está entre etiquetas td:

for tr in trs:<br />tds = tr.findAll('td')

Aquí tienes el código en funcionamiento:

test BeautifulSoap

test BeautifulSoap

Y de esta forma tan sencilla hemos extraido la información que queríamos.

Ahora, con las listas

Para las listas, el funcionamiento es muy similar. Se localiza el contenedor, en nuestro caso es nav nav-pills, y luego se itera sobre cada resultado.

lista = soap.findAll("ul", { "class" : "nav nav-pills" })<br />print len(lista)<br />for li in lista[0]:<br />   print li.string&lt;br /&gt;

Esta segunda parte en funcionamiento:

test BeautifulSoap

test BeautifulSoup

La extracción de información con Python usando BeautifulSoup podeis ver que es bastante sencilla, una vez investigado el código HTML de la página. Consiste en estudiar un poco los elementos que componen la página objetivo, y a partir de ahi, todo se basa en buscar y trabajar con listas!

El código completo lo teneis subido en GitHub.

En la próxima entrada veremos una ejemplo concreto que estoy usando en mi software de quinielas!

Espero que el contenido sea de vuestro interés!