De pequeño jugaba a balonmano. Era un fanático de este deporte y entrenaba todos los días. Ahora, como no me gano el pan gracias al balonmano, únicamente lo sigo por televisión y prensa.

Sin embargo, no me gusta tener que metermen en la web del marca cada vez que deseo ver cómo va la clasificación, así que nos vamos a hacer un script de Groovy que procese la web de marca y nos devuelva la clasificación de la liga asobal.

El XmlSlurper de Groovy es fantástico para procesar XML, pero para HTML lo mejor es pasarle un buen SAXParser como es tagsoup.

Lo primero, obviamente, es meternos en la web de marca, en la sección balonmano, y ver por dónde se encuentra la información que buscamos. Fácil, está metida dentro de un div cuyo id es bloque_pestanas_resultados. Podríamos haber profundizado más, pero nos quedaremos a este nivel. Dentro de este bloque, hay varios hijos: el primero guarda los resultados de la jornada, mientras que el tercero tiene la tabla clasificatoria (del segundo ya ni me acuerdo).

La tabla clasificatoria es una tabla HTML, y cada una de sus filas tiene tres columnas: la primera con la posición, la segunda con el nombre del equipo y la tercera con el número de puntos conseguidos a día de hoy.

Bueno, ya sabemos que necesitamos TagSoup y ya conocemos el HTML a procesar para hacer nuestras consultas GPath (como el XPath, pero más fácil). Manos a la obra:

import org.ccil.cowan.tagsoup.Parser

def slurper = new XmlSlurper(new Parser())
def html = slurper.parse("http://www.marca.com/balonmano.html")
def tabla = [] //Guardamos la tabla de clasificaciones en una lista

html.body.'**'.find { //Búsqueda recursiva a partir del body
    it.@id.text() == 'bloque_pestanas_resultados'
}.children()[2].div.table.tbody.'*'.findAll{ //Búsqueda de primer nivel a partir de la tabla
    it.name() == 'tr'
}.each{ fila ->
    def entrada = [:] //Guardamos cada línea de la tabla de clasificaciones en un mapa

    def posicion = fila.children()[0].text()
    def equipo = fila.children()[1].text().replaceAll("\\n", "").replaceAll("\\*", "").trim()
    def puntos = fila.children()[2].text()

    entrada["posicion"] = posicion
    entrada["equipo"]   = equipo
    entrada["puntos"]   = puntos

    tabla.add(entrada)
}

Ahora que ya tenemos los resultados, lo único que nos quedaría sería imprimirlos por pantalla. Vamos a aprovecharnos del padding de strings para darle un aspecto tabular a la tabla clasificatoria:

print "#".padRight(4, ' ')
print "EQUIPO".padRight(40, ' ')
println "PUNTOS".padRight(6, ' ')

tabla.each{ entrada ->
    print entrada['posicion'].padRight(4, ' ')
    print entrada['equipo'].padRight(40, ' ')
    println entrada['puntos'].padRight(6, ' ')
}

Con estos dos bloques de código, hemos conseguido pintar la clasificación de la liga asobal de balonmano:

#   EQUIPO                                  PUNTOS
1   FC Barcelona Borges                     52
2   Renovalia Ciudad Real                   46
3   Cuatro Rayas Valladolid                 37
4   Reale Ademar                            37
5   Fraikin Granollers                      36
6   CAI BM. Aragón                          34
7   Amaya Sport San Antonio                 28
8   Cuenca 2016                             24
9   Naturhouse La Rioja                     22
10  BM. Antequera                           21
11  BM. Torrevieja                          20
12  Quabit BM Guadalajara                   17
13  Alser-BM Puerto Sagunto                 15
14  J.D. Arrate                             12
15  Lábaro Toledo BM                        8
16  BM Alcobendas                           5

Fuentes:
Processing XML with Groovy
GPath
stackoverflow

Anuncios