Abr
20
Extraindo dados com Ruby e Hpricot
Abril 20, 2007 |
Hoje em dia as informações que podem alimentar um sistema ou website, são de vários formatos e fontes diferentes, exemplo: Sistema de Suporte a Decisão e aplicações Mashup e para demonstrar como isso é simples de se fazer usando Ruby, escrevi o exemplo abaixo baseado no artigo "Scraping IMDB with Ruby and Hpricot".
Neste exemplo, serão extraidas informações sobre Ações do site Google Finance. O exemplo tenta mostrar algumas das maneiras utilizadas para se buscar as informações nas tags das páginas.
O pré-requisito para que a classe funcione é a biblioteca Hpricote, que é um parse HTML baseado na biblioteca HTree e JQuery, porém recodificado em C. A instalação pode ser feita pelo comando:
gem install hpricot
Vamos criar a classe Finance, que ao ser instanciada recebe o endereço da Ação que desejamos extrair as informações:
RUBY:
-
class Finance
-
require 'rubygems'
-
require 'hpricot'
-
require 'open-uri'
-
-
#inicializa as variáveis ao instanciar
-
#a classe Finances
-
def initialize(url)
-
@hp = Hpricot(open(url))
-
end
-
end
Para obter o símbolo da Ação consultada, vamos por exemplo extrair do link conforme a tela abaixo:
Para isso vamos criar o método symbol:
RUBY:
-
def symbol
-
#procura pelas tags <strong><a href="http://www.lednerd.com/">...</a></strong>,
-
#extrai o conteúdo e remove os caracteres \n
-
@symbol = (@hp/"b/a").inner_text.gsub(/\n/,'')
-
end
Para obtermos o título da Ação, vamos extrair do cabeçalho H1 conforme tela abaixo:
Para isso vamos criar o método title:
RUBY:
-
def title
-
#procura pelo tag <h1>...</h1>
-
#e extrai o conteúdo
-
@title = (@hp/"h1").inner_text
-
end
Para obtermos o índice da Ação, vamos extrair do SPAN conforme tela abaixo:
Para isso vamos criar o método index:
RUBY:
-
def index
-
#procura pela tag <span class="pr">...</span>
-
#e extrai o conteúdo
-
@index = @hp.at("span[@class='pr']").inner_text
-
end
Para extrairmos o valor da variação da Ação, vamos extrair do SPAN conforme tela abaixo:
Para isso vamos criar o método change:
RUBY:
-
def change
-
#procura pelas tags <strong><span class="chg">...</span></strong>
-
#e extrai o conteúdo
-
@change = (@hp/"b/span.chg").inner_text
-
end
Para extrairmos o percentual de variação da Ação, vamos extrair do SPAN conforme tela abaixo:
Para isso vamos criar o método percente_change:
RUBY:
-
def percente_change
-
#extrai o html do <p id="market_data_div">...</p>
-
market_data = @hp.search('#market_data_div')
-
#procura pelas tags <span class="chg">...</span>
-
-
#e extrai o conteúdo e remove os parênteses
-
@percente_change = (market_data/"td/span.chg").inner_text.gsub(/[()]/,'')
-
end
O resultado final será como a classe abaixo:
RUBY:
-
class Finance
-
require 'rubygems'
-
require 'hpricot'
-
require 'open-uri'
-
-
#inicializa as variáveis ao instanciar
-
#a classe Finances
-
def initialize(url)
-
@hp = Hpricot(open(url))
-
end
-
-
def symbol
-
#procura pelas tags <b><a href=..>...</a></b>,
-
#extrai o conteúdo e remove os caracteres \n
-
@symbol = (@hp/"b/a").inner_text.gsub(/\n/,'')
-
end
-
-
def title
-
#procura pelo tag <h1>...</h1>
-
#e extrai o conteúdo
-
@title = (@hp/"h1").inner_text
-
end
-
-
def index
-
#procura pela tag <span class='pr'>...</span>
-
#e extrai o conteúdo
-
@index = @hp.at("span[@class='pr']").inner_text
-
end
-
-
def change
-
#procura pelas tags <b><span class='chg'>...</span></b>
-
#e extrai o conteúdo
-
@change = (@hp/"b/span.chg").inner_text
-
end
-
-
def percente_change
-
#extrai o html do <div id="market_data_div">...</div>
-
market_data = @hp.search('#market_data_div')
-
#procura pelas tags <td><span class='chg'>...</span></td>
-
#e extrai o conteúdo e remove os parênteses
-
@percente_change = (market_data/"td/span.chg").inner_text.gsub(/[()]/,'')
-
end
-
end
Para testar a classe podemos criar o script abaixo e executá-lo:
RUBY:
-
require 'finance'
-
-
f = Finance.new("http://finance.google.com/finance?q=RIO")
-
-
p f.symbol
-
p f.title
-
p f.index
-
p f.change
-
p f.percente_change
Resultado:
O exemplo é simples, mas demonstra como poderiamos extrair informações de qualquer página e utilizá-las em nossas aplicações Web (com Ruby on Rails
)
Outra poderosa biblioteca que faz uso do Hpricot é o scRUBYt!, mas falarei dela em uma outra oportunidade.
Este post está participando do concurso promovido pelo site Simples Idéias.
Comentários
4 Comments so far








(5 votes, average: 3.8 out of 5)


Extraindo dados com Ruby e Hpricote
Hoje em dia as informaes que podem alimentar um sistema ou website, so de vrios formatos e fontes diferentes, veja como isso simples de se fazer em Ruby…
Extraindo dados com Ruby e Hpricote
Hoje em dia as informações que podem alimentar um sistema ou website, são de vários formatos e fontes diferentes, veja como isso é simples de se fazer em Ruby…
Olá, gostaria de saber se o browser que você usou para mostrar estas figuras do google finance é o firefox. Se for, qual o nome da extensão para ver o HTML no rodape do firefox, que nem você fez, como da para ver nas figuras do google finance. Obrigadão!
Olá Hugo,
Sim, usei o Firefox. O plugin é o Firebug. Para saber um pouco mais, veja o post Conheça o poder do Firebug.
Abraço