Como estou no trabalho, e por aqui não tem uma TV por perto, estava acessando demais o quadro de medalhas do Terra. Então, pensei: porque não fazer um programinha Ruby que me retornasse a colocação e as medalhas do Brasil?

Então, mãos à obra!

O que é preciso?

Vou usar a excelente biblioteca de parser HTML chamada Hpricot.

O código HTML do Terra

Vamos analisar o código HTML da página que mostra o quadro de medalhas do Terra.

O quadro de medalhas está dentro de uma tabela com a classe: tab_med

<table width="100%" border="0" cellpadding="0" cellspacing="1" class="tab_med">

Dentro desta tabela, temos vários tr’s , com um td dentro, cuja classe é pais. É esse que nos interessa. Pois, aqui, vamos encontrar a colocação, e o nome do país.

O número de medalhas se encontra dentro de outros td’s, cuja classes são: val_ouro, val_prata, val_bronze e val_tot para medalhas de Ouro, Prata, Bronze e Totais, respectivamente.

O código Ruby

Primeiramente, vamos chamar as bibliotecas Hpricot, e Open-URI (para abrir uma página Web).

require 'rubygems'
require 'hpricot'
require 'open-uri'

Agora, vamos abrir a página que vamos fazer o parsing

doc = Hpricot(open("http://agendapan.terra.com.br/br/medalhas/medalheiro.html"))

Extraindo a colocação

Vamos então, montar um código que passa por todos os td’s com a classe pais, e encontrar um link (a), que aponta para a página específica de medalhas do Brasil.

doc.search(”td.pais”).each do |pais|
pais.search(”a[@href='/br/medalhas/BRA/medalheiro_1.html']“) do
@colocacao = pais.inner_html[0..1].to_i
end
end

puts @colocacao

As medalhas

Após ter encontrado a colocação do Brasil, vamos exibir as medalhas ganhas até agora, encontrando o enésimo tr dentro de nossa tabela, usando a colocação como referência. Após isso, é só extrair o conteúdo dos td’s cuja classe sejam as das medalhas que procuramos.

doc.search("table.tab_med").at("tr:nth-of-type(#{@colocacao})") do |medalhas|
  puts "Ouro: #{medalhas.search("td.val_ouro").inner_html}"
  puts "Prata: #{medalhas.search("td.val_prata").inner_html}"
  puts "Bronze: #{medalhas.search("td.val_bronze").inner_html}"
  puts "Total: #{medalhas.search("td.val_tot").inner_html}"
end

O código completo

require 'rubygems'
require 'hpricot'
require 'open-uri'
 
doc = Hpricot(open("http://agendapan.terra.com.br/br/medalhas/medalheiro.html"))
 
doc.search("td.pais").each do |pais|
  pais.search("a[@href='/br/medalhas/BRA/medalheiro_1.html']") do
    @colocacao = pais.inner_html[0..1].to_i
  end
end
 
puts @colocacao
 
doc.search("table.tab_med").at("tr:nth-of-type(#{@colocacao})") do |medalhas|
  puts "Ouro: #{medalhas.search("td.val_ouro").inner_html}"
  puts "Prata: #{medalhas.search("td.val_prata").inner_html}"
  puts "Bronze: #{medalhas.search("td.val_bronze").inner_html}"
  puts "Total: #{medalhas.search("td.val_tot").inner_html}"
end

Mais um problema resolvido, usando Ruby! :)

Tags: , / Trackback URI: trackback

4 comentários em “Mostrando a Colocação do Brasil no Pan 2007, usando Ruby!”

  1. 17/07/07 às 2:57 pm #Carlos Brando

    Fala a verdade, vc tava é sem o que fazer no serviço. Fala ai? hehe

    Mas gostei do exemplo de uso do Hpricot.
    Abraço!

  2. 17/07/07 às 2:57 pm #Eduardo A. Reche Lopes

    Cara, q jóia… vou usar esse exemplo pra muita coisa.. heheh…

    Mas aqui na empresa eu tenho proxy com autenticação, não consegui fazer funcionar. Sem autenticação é só fazer assim:
    doc = Hpricot(open("http://agendapan.terra.com.br/br/medalhas/medalheiro.html", :proxy => "http://servidor:porta"))

    Mas como adiciono o usuário e senha?

  3. 17/07/07 às 2:57 pm #ArthurGeek

    Carlos: Fiz esse programinha no horário de almoço, e não demorei nem 15minutos. ;) heheh

    Eduardo: Dei uma pesquisada aqui por suporte à proxy no open-uri, e não achei nada para proxy com autenticação.

  4. 17/07/07 às 2:57 pm #Viviane

    eu quero saber sobre o brasil no pan-2007

Deixe um comentário

Não é aceito código HTML