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:
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
</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:
Lo vemos funcionando:
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!