En esta entrada voy a exponer cómo he resuelto un problema para automatizar más algunas partes de mi software de Fútbol. He utilizado Python., junto con BeautifulSoap, con el fin de extraer toda la información sobre los escrutinios de la quiniela, esto es, lo que cobran los acertantes, recaudación y bote de la quiniela. En la entrada anterior vimos cómo instalarlo, y qué podemos hacer con él, pero ahora vamos a aplicarlo para solventar una cuestión concreta.
El objetivo a extraer
El contenido a extraer es el marcado en el cuadrado rojo, donde se recogen información de recaudación, bote y escrutinios para los acertantes de la quiniela:
El objetivo final es guardar esos 8 datos que nos interesan en un fichero de texto.
En una entrada anterior, vimos cómo recuperar el código HTML de una web en Python (también en C#, pero aquí nos interesa Python). Sin embargo, es necesario estudiar el código HTML del apartado que nos interesa, para lo que usamos las herramientas para desarrolladores incluidas en Firefox, o en Chrome).
En concreto, nos interesa una tabla que incluye una clase llamada “fill-table m1015“. Crearemos la siguiente entencia a utilizar con BeautifulSoap:
soup = bs(data) tEscritunio = soup.findAll("table", { "class" : "fill-table m1015" })
Sin embargo, debemos ser conscientes de que nos podemos encontrar con que aún NO están preparados los datos:
Necesitamos crear varias rutinas de comprobación:
- Una para selecciona sólo las filas válidas,
- Y otra para guardar el contenido de una lista en un fichero de texto.
En este primer caso, comprobaremos que el número de filas de la tabla, que incluyan cadenas de texto válidas (la función EsLineaValida comprueba que tenga longitud, y que no contenga * ni la cadena “Euros“, y se ha creado una nueva función por si es necesario personalizar con algún término nuevo cuando el resultado obtenido NO tenga 8 registros).
def EsLineaValida(linea): if len(linea) == 0: return False if "*" in linea: return False if "Euros" in linea: return False return True
En realidad, estamos intentando rescatar solo las 8 filas que nos interesan, y que son recaudación, bote, y acertantes de 15, 14, 13, 12, 11 y 10. Sólo en este caso, seguiremos adelante con la extracción de datos. Por el momento, guardamos la información en un fichero de texto plano. Si el resultado obtenido NO tiene los 8 datos requeridos, saldrá un mensaje de que NO hemos obtenido la recaudación.
La función que guarda la lista con los datos que me interesan es la siguiente (nl = “/n” para nueva línea):
def saveList2File(file, lista): sfile = open(file,"w") for linea in lista: sfile.writelines(str(linea) + nl) sfile.close()
La función principal es la siguiente:
def Escrutinio(dataHTML, ficheroSalida, jorn): soup = bs(dataHTML) # BeautifulSoap para el código HTML tEscritunio = soup.findAll("table", { "class" : "fill-table m1015" }) # TABLA tr = [] for mydiv in tEscritunio: rows = mydiv.findAll('tr') for row in rows: if EsLineaValida(row.text): tmp = row.text.strip().split(nl)[-1] # ULTIMA COLUMNA tmp = tmp.replace('.','') # Ajuste tr.append( tmp) if len(tr) == 8: saveList2File(ficheroSalida, tr) print "Escrutinio recuperada!" else: print "DATOS de Escrutinio NO son los esperados!" + nl, tr time.sleep(2)
Vemos el código funcionando:
El código en Python está subido a GitHub, para que lo podais descargar, y probar.
Yo estoy encantado con Python porque la extracción de datos desde páginas Web es bastante sencillo usando BeautifulSoap. En otra entrada pondré cómo recuperar los marcadores de los partidos de una jornada concreta, dado que también me va a hacer falta, y no es demasiado complicado.
Espero les haya sido de utilidad, porque a mi sí que me ahorra tiempo, y me reduce errores!