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.
Puedes comprobar que con pip no he sido capaz de instalarlo, mientras que se ha instalado correctamente con easy_install. Ahora confirmamos que funciona.
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:
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:
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<br />
Esta segunda parte en funcionamiento:
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!