Python y BeautifulSoup: resultados de los partidos de la liga de fútbol española

Posted by in Python

Nuevo capítulo de web scrapping, y esta vez queremos recuperar los marcadores de los partidos de futbol de primera y/o segunda división de la Liga de fútbol Profesional de España. Para ello, preparamos una rutina para que pregunte división, y jornada.


def pregunta(mensaje, opciones):
ask = raw_input(mensaje)
try:
return ask if int(ask) in opciones else ''
except:
return ''

El resultado es este:

Pregunta division y jornada

Pregunta division y jornada

Ya tenemos los 2 datos que necesitamos.

Ahora, le restamos uno a la división puesto que tenemos una lista con las dos URLs, una para cada división (y que son esta y esta). Usando lo que ya vimos en la entrada sobre extraer códigos HTML con #Python, obtenemos el código que le pasamos a BeautifulSoup.

Pero antes, vamos a definir la clase Partido:

class Marcadores():
""" Datos extraidos desde MARCA.com con los marcadores """
def __init__(self, eql, eqv, golL, golV ):
self.eql = eql.lower().decode('utf-8')
self.eqv =  eqv.lower().decode('utf-8')
self.golL = golL
self.golV = golV
def __str__(self):
return self.eql + " " + self.eqv + " --> " + self.golL + " - " + self.golV

Pero aún necesitamos más funciones. Una de ellas es para eliminar los acentos, y que descubrí en este sitio:

import unicodedata # Tildes http://www.leccionespracticas.com/uncategorized/eliminar-tildes-con-python-solucionado/

</pre>
# Elimina TILDES
def elimina_tildes(s): return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))
<pre>

También necesitamos otra función para “ajustar” los resultados:

def ajustaGoles(marca):
""" Ajuste de goles, devolviendo gol como string """
try:
marca[0] = str(int(marca[0]))
marca[1] = str(int(marca[1]))
except:
marca[0] = ''
marca[1] = ''
return marca

La función que hace la extracción de los resultados es esta:

def obtenerResultados(data, jorn):
""" Ejecuta la extracción de la información desde el código HTML extraido """
soup = bs(data)
tjornadas = soup.findAll("div", { "class" : "jornada calendarioInternacional" })
print len(tjornadas), " jornadas"
#for jornada in tjornadas:
#    print jornada.text
#print tjornadas[jorn-1]
tlocales = tjornadas[jorn-1].findAll("td", { "class" : "local" })
tvisits = tjornadas[jorn-1].findAll("td", { "class" : "visitante" })
tresults = tjornadas[jorn-1].findAll("td", { "class" : "resultado" })
#print len(tlocales), len(tvisits), len(tresults)
lMarcadores = []
for i in range(0,len(tlocales)):
goles = tresults[i].text.split(separaGoles)
goles = ajustaGoles(goles)
partido = Marcadores(elimina_tildes(tlocales[i].text), elimina_tildes(tvisits[i].text), goles[0], goles[1])
lMarcadores.append(partido)
return lMarcadores   # tjornadas[jorn-1].text

En realidad, para conocer qué debiamos extraer, y al igual que con la extracción de los escrutinios, hemos utilizado las herramientas de desarrollo de firefox:

Herramientas de desarrollo web

Herramientas de desarrollo web

Lo vemos funcionando:

Extrae Marcadores

Extrae Marcadores

Podeis ver el código completo en GitHub.

Y esto es todo! En realidad, esta versión que aquí presento es exclusiva para este post, porque el código que yo utilizo no me pide división ni jornada, sino que lo extrae de un fichero de configuración. También os he hablado de esto en www.manejandodatos.es.

Si teneis alguna consulta, o duda, contactais conmigo o en los comentarios.

Y … espero que os sea de utilidad!

Google+ Comments - Comentarios Google+