Extraindo dados com Ruby e 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:
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:
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:
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:
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:
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:
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:
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:
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.
- abril 20, 2007
- por Anderson
- 10 comentários
10 Comentários para “Extraindo dados com Ruby e Hpricot”
12 de maio de 2007 às 19:37
14 de maio de 2007 às 9:27
Sim, usei o Firefox. O plugin é o Firebug. Para saber um pouco mais, veja o post Conheça o poder do Firebug.
Abraço
4 de maio de 2010 às 8:27
4 de maio de 2010 às 8:29
in `index’: undefined method `inner_text’ for nil:NilClass [NoMethodError]
Agradeço se puder ajduar e parabéns pelo blog.
Abraço.
24 de agosto de 2011 às 16:07
Valeu cara , muito bom!
25 de agosto de 2011 às 20:04
Deixe uma resposta