Estoy desarrollando la web del Club de Rugby Málaga, y necesito mostrar la clasificación de los equipos. Para hacer la actualización lo más automática posible, no hay nada más automático que extraer esa información de otro sitio donde esté publicado. Por supuesto, no hay que olvidar citar la fuente y poner algún enlace.
PrerrequisitosYo he utilizado la gema
HPRICOT (aunque su sitio web parece no estar activo, la gema se puede instalar).
Para instalarla: sudo gem install hpricot
Además hacen falta las gemas
rubygems y
open-uri.
Manos a la obraLa información en cuestión está en la
Federación Española de Rugby. En el enlace
calendario liga está la información que necesito.
Para ver únicamente la información necesaria, copio la ruta del enlace y lo abro en una nueva pestaña.
La página contiene varias listas desplegables para seleccionar categoría, temporada y equipo. Establezco las listas desplegables con los valores deseados y ya tengo la página de la que quiero extraer la información.
La ruta de la página (junto con los parámetros) es
http://www.ferugby.com/competiciones/calendario.php?id2=3&fecha_1=2008&cat=Liga+Nacional#j7Como la parte final (#j7) es un enlace local (o ancla) a la propia página, lo descartaré. La página se puede leer con:
page = Hpricot( open(url) )
Revisando el código fuente de la página, todas las tablas de jornadas están dentro de tablas con el tag HTML:
<table id="tabla" bordercolor="#990000" cellspacing="0" cellpadding="0" align="center" border="0" />
Con
hpricot se puede extraer un array de tags que contengan una determinada propiedad. Para este caso
@tablas = page.search("//table[@id='tabla']" )
Así, ya tenemos el controlador:
def mostrar_calendario_liga
url = 'http://www.ferugby.com/competiciones/calendario.php?id2=3&fecha_1=2008&ide=&cat=Liga+Nacional'
#page = Hpricot(url) #si las codificaciones coinciden
page = Hpricot(Iconv.iconv("UTF-8", "ISO-8859-1", open(url).read).join )
@tablas = page.search("//table[@id='tabla']" )
end
Para la vista, hay que ver que cada tabla de cada jornada, tiene la siguiente estructura:
- 1ª fila: Número de jornada.
- 2ª fila: Encabezados de columnas.
- 3ª fila en adelante: Datos de los partidos.
Así, la vista queda:
<%for t in @tablas do%>
<%filas=t.search("//tr")%>
<table id="tabla" align="center" border="0">
<tbody>
<tr id="fil1">
<td id="cabecera_fila1" colspan="7">
<%=t.search("//tr").first.search("//td").first.inner_html%>
</td>
</tr>
<tr id="fil2">
<td width="1" align="center"></td>
<td width="1" align="center">FECHA</td>
<td width="1" align="center">HORA</td>
<td width="50%" align="center">EQUIPO LOCAL</td>
<td colspan="2" width="60" align="center">RESULTADO</td>
<td width="50%" align="center">EQUIPO VISITANTE</td>
</tr>
<%for r in filas[2..20]%>
<tr id="fila_contenido">
<%celdas=r.search("//td")%>
<%for celda in celdas[0..6] do%>
<td>
<%c=celda.search("//a")%>
<%c=celda if c.size == 0%>
<%if c.inner_html.include?('UMA')%>
<strong><%=c.inner_html%></strong>
<%else%>
<%=c.inner_html%>
<%end%>
</td>
<%end%>
</tr>
<%end%>
</tbody>
</table>
<%end%>
<p>
Los resultados se actualizan directamente desde la página de la
<a href="http://www.ferugby.com">Federación Española de Rugby</a>.
</p>
En la línea 18 pongo [2..20] para saltar las dos primeras filas, y un número suficiente (20 en este caso) para que no queden sin mostrar.
En la línea 20 se extraen los contenidos de los TD de la fila.
En la línea 21 se recorren los TD.
En las líneas 23 y 24 se extrae el contenido descartando la existencia de un posible enlace.
En las líneas de 25 a 29 se expone el contenido, destacando los que contengan el texto 'UMA'.
Lo último es elegir los estilos CSS para los ID de los tags de las tablas y conseguir el aspecto deseado.
Espero que le sirva a alguien, como me va a servir a mí para completar el resto de categorías.