def descargaPlantillasCabecera(browser=None, config=Namespace()): """ Descarga los contenidos de las plantillas y los procesa. Servirá para alimentar las plantillas de TemporadaACB :param browser: :param config: :param jugId2nombre: :return: """ result = dict() if browser is None: browser = creaBrowser(config) paginaRaiz = DescargaPagina(dest=URL_BASE, browser=browser, config=config) if paginaRaiz is None: raise Exception("Incapaz de descargar %s" % URL_BASE) raizData = paginaRaiz['data'] divLogos = raizData.find('div', {'class': 'contenedor_logos_equipos'}) for eqLink in divLogos.find_all('a', {'class': 'equipo_logo'}): urlLink = eqLink['href'] urlFull = MergeURL(browser.get_url(), urlLink) idEq = getObjID(objURL=urlFull, clave='id') result[idEq] = descargaURLplantilla(urlFull) return result
def descargaURLficha(urlFicha, home=None, browser=None, config=Namespace()): if browser is None: browser = creaBrowser(config) try: result = dict() fichaJug = DescargaPagina(urlFicha, home=home, browser=browser, config=config) result['URL'] = browser.get_url() result['timestamp'] = gmtime() result['id'] = getObjID(urlFicha, 'ver') fichaData = fichaJug['data'] cosasUtiles = fichaData.find(name='div', attrs={'class': 'datos'}) result['urlFoto'] = cosasUtiles.find('div', attrs={'class': 'foto'}).find('img')['src'] result['alias'] = cosasUtiles.find('h1').get_text().strip() for row in cosasUtiles.findAll('div', {'class': ['datos_basicos', 'datos_secundarios']}): valor = row.find("span", {'class': 'roboto_condensed_bold'}).get_text().strip() classDiv = row.attrs['class'] if 'equipo' in classDiv: continue elif 'dorsal' in classDiv: continue elif 'posicion' in classDiv: result['posicion'] = valor elif 'altura' in classDiv: REaltura = r'^(\d)[,.](\d{2})\s*m$' reProc = re.match(REaltura, valor) if reProc: result['altura'] = 100 * int(reProc.group(1)) + int(reProc.group(2)) else: print("ALTURA no casa RE", valor, REaltura) elif 'lugar_nacimiento' in classDiv: result['lugarNac'] = valor elif 'fecha_nacimiento' in classDiv: REfechaNac = r'^(?P<fechanac>\d{2}/\d{2}/\d{4})\s*.*' reProc = re.match(REfechaNac, valor) if reProc: result['fechaNac'] = pd.to_datetime(reProc['fechanac'], format=PATRONFECHA) else: print("FECHANAC no casa RE", valor, REfechaNac) elif 'nacionalidad' in classDiv: result['nacionalidad'] = valor elif 'licencia' in classDiv: result['licencia'] = valor else: if 'Nombre completo:' in row.get_text(): result['nombre'] = valor else: print("Fila no casa categorías conocidas", row) except Exception as exc: print("descargaURLficha: problemas descargando '%s': %s" % (urlFicha, exc)) raise exc return result
def procesaTablaBajas(tablaBajas: bs4.element, traduccionesConocidas: dict) -> dict: auxTraducciones = traduccionesConocidas or dict() result = defaultdict(dict) for row in tablaBajas.find("tbody").find_all("tr"): tds = list(row.find_all("td")) data = dict() link = tds[1].find("a").attrs['href'] data['URL'] = MergeURL(URL_BASE, link) data['id'] = getObjID(link, 'ver') data['activo'] = False data['nombre'] = set().union(auxTraducciones.get(data['id'], set())) data['dorsal'] = row.find("td", {"class": "dorsal"}).get_text().strip() nuevosNombres = { sp.get_text().strip() for sp in row.find("td", { "class": "jugador" }).find_all("span") } data['nombre'].update(nuevosNombres) posics = {tds[2].find("span").get_text().strip()} destClass = 'tecnicos' if "ENT" in posics else 'jugadores' result[destClass][data['id']] = data return result
def procesaDivCabecera(self, divATratar): equipos = [(x.find("a")['href'], x.find("img")['title'].strip()) for x in divATratar.find_all("div", {"class": "logo_equipo"})] puntos = [int(x.get_text()) for x in divATratar.find_all("div", {"class": "resultado"})] divParciales = divATratar.find("tbody") auxParciales = [[int(p.get_text()) for p in r.find_all("td", {"class": "parcial"})] for r in divParciales.find_all("tr")] parciales = list(zip(*auxParciales)) abrevs = [p.get_text() for p in divParciales.find_all("td", {"class": "equipo"})] for l, p in zip(LocalVisitante, puntos): self.Equipos[l]['Puntos'] = p self.ResultadosParciales = parciales self.VictoriaLocal = self.Equipos['Local']['Puntos'] > self.Equipos['Visitante']['Puntos'] for l, e in zip(LocalVisitante, equipos): self.Equipos[l]['id'] = getObjID(e[0]) self.Equipos[l]['Nombre'] = e[1] for l, a in zip(LocalVisitante, abrevs): self.Equipos[l]['abrev'] = a
def procesaBloquePartido(self, datosJornada, divPartido): # TODO: incluir datos de competicion resultado = dict() resultado['pendiente'] = True resultado['fechaPartido'] = NEVER resultado['jornada'] = datosJornada['jornada'] resultado['cod_competicion'] = self.competicion resultado['cod_edicion'] = self.edicion datosPartEqs = dict() for eqUbic, div in zip( ETIQubiq, divPartido.find_all("div", {"class": "logo_equipo"})): auxDatos = datosPartEqs.get(eqUbic.capitalize(), {}) image = div.find("img") imageURL = MergeURL(self.urlbase, image['src']) imageALT = image['alt'] auxDatos.update({'icono': imageURL, 'imageTit': imageALT}) datosPartEqs[eqUbic.capitalize()] = auxDatos for eqUbic in ETIQubiq: auxDatos = datosPartEqs.get(eqUbic.capitalize(), {}) divsEq = divPartido.find_all("div", {"class": eqUbic}) infoEq = procesaDivsEquipo(divsEq) auxDatos.update(infoEq) self.nuevaTraduccionEquipo2Codigo( nombres=[infoEq['nomblargo'], infoEq['nombcorto']], abrev=infoEq['abrev'], id=None) datosPartEqs[eqUbic.capitalize()] = auxDatos resultado['equipos'] = datosPartEqs resultado['loc2abrev'] = { x: datosPartEqs[x]['abrev'] for x in datosPartEqs } resultado['abrev2loc'] = { datosPartEqs[x]['abrev']: x for x in datosPartEqs } resultado['participantes'] = { datosPartEqs[x]['abrev'] for x in datosPartEqs } if 'enlace' in datosPartEqs['Local']: resultado['pendiente'] = False linkGame = datosPartEqs['Local']['enlace'] resultado['url'] = MergeURL(self.url, linkGame) resultado['resultado'] = { x: datosPartEqs[x]['puntos'] for x in datosPartEqs } resultado['partido'] = getObjID(linkGame) else: divTiempo = divPartido.find('div', {"class": "info"}) if divTiempo: auxFecha = divTiempo.find('span', {"class": "fecha"}).next auxHora = divTiempo.find('span', {"class": "hora"}).get_text() if isinstance(auxFecha, str) and auxFecha != '': cadFecha = auxFecha.lower() cadHora = auxHora.strip() if auxHora else None resultado['fechaPartido'] = procesaFechaHoraPartido( cadFecha.strip(), cadHora, datosJornada) return resultado
def procesaPlantillaDescargada(plantDesc, otrosNombres: dict = None): """ Procesa el contenido de una página de plantilla :param plantDesc: bs4 contenido de la página de la plantilla :param otrosNombres: diccionario ID->set de nombres :return: """ auxTraducciones = otrosNombres or dict() result = {'jugadores': dict(), 'tecnicos': dict()} result['club'] = extraeDatosClub(plantDesc) fichaData = plantDesc['data'] cosasUtiles = fichaData.find(name='section', attrs={'class': 'contenido_central_equipo'}) for bloqueDiv in cosasUtiles.find_all('div', {"class": "grid_plantilla"}): for jugArt in bloqueDiv.find_all("article"): data = dict() link = jugArt.find("a").attrs['href'] data['id'] = getObjID(link, 'ver') # Carga con los nombres de una potencial traducción existente data['nombre'] = set().union(auxTraducciones.get( data['id'], set())) data['activo'] = True if {'caja_jugador_medio_cuerpo', 'caja_jugador_cara'}.intersection(jugArt.attrs['class']): destClass = 'jugadores' data['pos'] = jugArt.find("div", { "class": "posicion" }).get_text().strip() data['nombre'].add( jugArt.find("div", { "class": "nombre" }).get_text().strip()) elif {'caja_entrenador_principal', 'caja_entrenador_asistente' }.intersection(jugArt.attrs['class']): destClass = 'tecnicos' nuevosNombres = set() if 'caja_entrenador_principal' in jugArt.attrs['class']: nuevosNombres.add( jugArt.find("div", { "class": "nombre" }).get_text().strip()) nuevosNombres.add(jugArt.find("img").attrs['alt'].strip()) else: nuevosNombres = { sp.get_text().strip() for sp in jugArt.find("div", { "class": "nombre" }).find_all("span") } data['nombre'].update(nuevosNombres) else: raise ValueError( "procesaPlantillaDescargada: no sé cómo tratar entrada: %s" % jugArt) data['dorsal'] = jugArt.find("div", { "class": "dorsal" }).get_text().strip() data['URL'] = MergeURL(URL_BASE, link) data['URLimg'] = jugArt.find("img").attrs['src'] result[destClass][data['id']] = data tablaBajas = cosasUtiles.find("table", {"class": "plantilla_bajas"}) if tablaBajas: datosBajas = procesaTablaBajas(tablaBajas, auxTraducciones) result = actualizaConBajas(result, datosBajas) return result
def procesaLineaTablaEstadistica(self, fila, headers, estado): result = dict() result['competicion'] = self.competicion result['temporada'] = self.temporada result['jornada'] = self.jornada result['equipo'] = self.Equipos[estado]['Nombre'] result['CODequipo'] = self.Equipos[estado]['abrev'] result['IDequipo'] = self.Equipos[estado]['id'] result['rival'] = self.Equipos[OtherLoc(estado)]['Nombre'] result['CODrival'] = self.Equipos[OtherLoc(estado)]['abrev'] result['IDrival'] = self.Equipos[OtherLoc(estado)]['id'] result['url'] = self.url result['estado'] = estado result['esLocal'] = (estado == "Local") result['haGanado'] = self.ResultadoCalendario[estado] > self.ResultadoCalendario[OtherLoc(estado)] filaClass = fila.attrs.get('class', '') celdas = list(fila.find_all("td")) textos = [x.get_text().strip() for x in celdas] if (len(textos) == len(headers)): mergedTextos = dict(zip(headers[2:], textos[2:])) estads = self.procesaEstadisticas(mergedTextos) result['estads'] = estads if 'equipo' in filaClass or 'totales' in filaClass: result['esJugador'] = False result['entrenador'] = False result['noAsignado'] = 'equipo' in filaClass result['totalEquipo'] = 'totales' in filaClass if result['totalEquipo']: result['prorrogas'] = int(((estads['Segs'] / (5 * 60)) - 40) // 5) if estads['P'] != self.Equipos[estado]['Puntos']: print(estads, self.Equipos[estado]) raise BaseException("ProcesaLineaTablaEstadistica: TOTAL '%s' puntos '%i' " "no casan con encabezado '%i' " % (estado, estads['P'], self.Equipos[estado]['Puntos'])) else: # Jugadores result['esJugador'] = True result['entrenador'] = False result['haJugado'] = mergedTextos['Min'] != "" mergedCells = dict(zip(headers, celdas)) textoDorsal = mergedCells['D'].get_text() PATdorsal = r'(?P<titular>\*)?(?P<dorsal>\d+)' REdorsal = re.match(PATdorsal, textoDorsal) if REdorsal: result['dorsal'] = REdorsal['dorsal'] result['esTitular'] = REdorsal['titular'] == '*' else: raise ValueError("Texto dorsal '%s' no casa RE '%s'" % (textoDorsal, PATdorsal)) celNombre = mergedCells['Nombre'] result['nombre'] = celNombre.get_text() linkdata = (celdas[1].find("a"))['href'] result['linkPersona'] = linkdata result['codigo'] = getObjID(linkdata, 'ver', None) else: textoC0 = celdas[0].get_text() if textoC0 == 'E': result['esJugador'] = False result['entrenador'] = True result['dorsal'] = textoC0 celNombre = celdas[1] result['nombre'] = celNombre.get_text() linkdata = (celdas[1].find("a"))['href'] result['linkPersona'] = linkdata result['codigo'] = getObjID(linkdata, 'ver', None) else: # 5f lista de 5 faltas return None return result