Python y BeautifulSoup: Extraer escrutinio de la quiniela

Posted by in Python

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:

Zona de interés: Escrutinio

Zona de interés: Escrutinio

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).

Inspección Zona de Interés

Inspección Zona de Interés

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:

Recaudacion que NO interesa

Recaudacion que NO interesa

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:

Ejecutando md_escrutinio.py

Ejecutando md_escrutinio.py

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!

Google+ Comments - Comentarios Google+