Saltar al contenido

[Python] BeautifulSoup extrae código de una sopa de etiquetas HTML

Es posible que como desarrollador te hayas enfrentado alguna vez al «reto» de extraer información (del tipo que sea) de una página web. Es muy sencillo cuando eres «humano», pero un robot… No, no es tan fácil.

Imaginemos, por ejemplo que quisiéramos almacenar el número de artículos que tiene la Wikipedia en Español en un determinado momento. La forma más fácil es visitar la página destinada a tal efecto y, en la tabla, leer el número correspondiente y escribirlo (por ejemplo, en un archivo de texto). Pero la tarea se puede hacer muy tediosa (y de hecho lo es).

Pero nosotros no estamos aquí para hacer un trabajo de chinos. Para algo existen los cacharros con los cuales estás leyendo esto. Es mas cómodo encargarle esta pesada tarea a un ordenador. Pero, ¿cómo vamos a llevar a cabo nuestra tarea? Para este tipo de problemas existen los «parser», como lo es, en este caso, BeautifulSoup.

Estadisticas Wiki
El elemento td contiene los números que buscamos

Analizemos un poco la estructura de la página. Tiene una tabla, y nuestro valor deseado está dentro de un <td> que está (por suerte) perfectamente definido por un atributo class del tipo: «mw-statistics-numbers». En este caso es muy fácil extraer el texto que contiene los datos que buscamos. Con Python, y usando BS4, se haría así:

from bs4 import BeautifulSoup
import urllib

direcc = "https://es.wikipedia.org/wiki/Especial:Estad%C3%ADsticas"
page = urllib.urlopen(direcc).read()
sopa = BeautifulSoup(page)
articulos_raw = sopa.find('tr',class_="mw-statistics-articles").find('td',class_="mw-statistics-numbers").text
articulos_list = articulos_raw.split(u'\xa0')
numero = int(articulos_list[0]+articulos_list[1]+articulos_list[2])
print(numero)

Esto imprimirá el número de artículos convertido directamente a tipo entero. Nótese que se extrae una cadena con separación de miles por espacios.

Comentemos un poco el código. La primera línea importa el módulo BS4 (BeautifulSoup versión 4) que utilizaremos en el programa. En la 2ª, 4ª y 5ª línea utilizamos el módulo urllib para descargarnos un fichero de texto plano con el texto html de la página. En la sexta línea es cuando viene la miga: crea un objeto BeautifulSoup con el texto html descargado. En la séptima le pedimos al objeto de BeautifulSoup que encuentre dentro de un elemento tr cuya class es mw-statistics-article otro elemento td cuya class es mw-statistics-numbers. En el resto de las líneas lo que hacemos es crear una lista sin los espacios (\xa0) y luego la unimos, convirtiéndolo a int directamente.

Esta es una breve forma de obtener algo sencillito, pero para cualquier cosa, hay disponible una excelente documentación en el idioma de Shakespeare para hacer casi cualquier cosa. Y si la cosa falla, Google y StackOverflow son buenos amigos.

Os dejo un zip (7z) con el programilla entero, por si alguno le interesa trastear con esto más a fondo 😉

Saludos 🙂

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.