Parsear una tabla html con beautifulSoup. O como scrapear una web usando requests y bs4

21/04/2018 | Autor: Eduardo Enriquez

Quería compartiles una pequeña función que hice con requestsbeautifulSoup para scrapear un web para mi bot de telegram: eduzen_bot.

import requests
from bs4 import BeautifulSoup


def get_estado_del_subte():
    r = requests.get("http://enelsubte.com/estado/")
    r.encoding = "utf-8"
    msg = "No pudimos conseguir el subte via web"

    if r.status_code != 200:
        return msg

    data = r.text
    if not data:
        return msg

    soup = BeautifulSoup(data, "html.parser")
    table = soup.find_all("table", {"id": "tabla-estado"})

    if not table:
        return msg

    text = []
    for row in table[0].find_all("tr"):
        for cell in row.find_all("td"):
            text.append(cell.get_text().strip())
            text.append(" ")
        text.append('\n')

    return "".join(text)

Bueno una pequeña explicación:

1) La primera parte simplemente hace el pedido http a la web deseada y nos fijamos que sea satisfactorio el requests (que el estado del pedido http se 200) y que el pedido hecho (el request) tenga info adentro, o sea que r.text tenga algo.

2) Con esta data obtenida de la web (esa data no es otra cosa que html) se la damos a bs4 (BeautifulSoup en su version 4) para que la parsee. 

3) Después utilizamos la funcion find_all (encontra todo lo que sea un tag especifico html y con un atributo en particular) de esta manera nos quedamos solo con la tabla que yo quiero. Vale decir que esta tabla se que es la que quiero porque entre con el navegador y en modo desarrollo inspeccioné el html en búsca de aquella caracteristica única que me permitiria encontrarla cuando la parseo. En este caso fue que sea una tabla y que su id fuese "tabla-estado".

Una vez con la tabla recorrerla con BeautifulSoup no es dificil:

text = []

for row in table[0].find_all("tr"):

    for cell in row.find_all("td"):

        text.append(cell.get_text().strip())
        text.append(" ")
    
    text.append('\n')

Basicamente recorremos las filas encontrandolas con find_all y una vez que tenemos las filas (las rows) buscamos sus columnas, sus celdas. Y una vez tenida la celda le sacamos el texto, le sacamos los espacios extras y lo apendeamos a una lista. También apendeo un espacio porque despues quiero unir el resultado y quiero un texto como un parrafo. Por eso cada vez que termina una fila, una row, agrego también un enter, un salto de linea.

El resultado es luego de un join:

print( "".join(text).strip() )


A Normal 
B Normal 
C Normal 
D Normal 
E Normal 
H Normal 
P Normal 
U Normal 
Actualizado 2018-04-21T16:14:05+0000

Espero que les sirva!


Tags