Parsear HTML, es decir leer la estructura del código que hay detrás de una página Web es una necesidad en muchos casos en que se necesitan validar campos o se requiere cambiar la estructura dinámicamente. Para hacerlo, los lenguajes diferentes a Javascript se valen de librerías, hoy hablaremos de BeatifulSoup, una de las alternativas de Python para hacerlo.
El HTML de las páginas Web tiene lo que se conoce como DOM (Document Object Model), es decir una estructura jerárquica que va desde la etiqueta HTML y BODY hasta los distintos componentes anidados dentro de otros que componen el documento. Imagínense que necesitan validar que una página contiene un control DIV dentro del cual hay un SPAN con un nombre en especial: Esto implicaría una búsqueda secuencial donde a través de la estructura tendría que ir iterando hasta encontrar el DIV que contiene la condición particular que buscamos.
En Python, existe una librería llamada BeautifulSoup, es decir algo así como “sopa bonita” en español; yo lo interpreto como la forma de evitar que navegar dentro del HTML en Python se vuelva una sopa o mejor un espagueti.
Para usar BeautifulSoup hay que instalarlo desde su sitio o mediante las herramientas de Python o mejor, desde los repos de las distros basadas en Debian o Ubuntu.
Habría que anotar que también hay que instalar Urllib2 para poder obtener la página en especial, esta librería de Python hace las veces de navegador obteniendo la página que queremos simplemente dándole la dirección URL.
¿Cómo hacerlo?
Lo primero es obtener la página Web, para ello utilizamos Urllib2:
content = urllib2.open([Aquí colocamos la URL, por ejemplo: https://www.camayihi.org])
Luego obtenemos la sopa con BeautifulSoup:
sopa = BeautifulSoup(content)
Ahora se puede hacer la búsqueda dentro de la sopa, se pueden obtener todos los elementos de cierto tipo (ej: DIVs), o con una característica particular:
a = sopa.find('a',{'id':'texto'}) #Busca todos los enlaces (A) que tengo como ID la palabra texto, obviamente uno solo
lis = soup.findAll('div', {'class' :'lista'}) #Busca todos los controles DIV que tengan como clase CSS el valor lista
En el primer caso devuelve un solo elemento con sus atributos y en el segundo devuelve un arreglo de elementos; en ambos casos se pueden obtener los atributos:
#Caso de un solo elemento
print(a.get('href')) #Imprime el valor del vínculo al que apunta el control
#Caso de un listado
for li in lis:
print(li.get('style')) #Imprime los estilos en línea aplicados al DIV
De igual forma como el HTML es jerárquico podemos indagar los controles internamente usando find o findAll como necesitemos hacerlo.
Imagen tomada de: http://pixabay.com/p-297736/?no_redirect