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! :)
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!
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?
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.
17/07/07 às 2:57 pm #Viviane
eu quero saber sobre o brasil no pan-2007