
O scRUBYt! é um gem muito útil para quem precisa recuperar dados à partir de uma página na web. Ele faz uso do Hpricot e do Mechanize e busca pelos dados usando um sistema de exemplos. Se estiver interessado em ver como funciona acesse o site oficial do projeto e veja os tutoriais.
O problema é que a versão final (0.3.0) não funciona direito no Windows, pelo menos não sem uma série de configurações e gambiarras. A melhor versão para Windows é a versão 1.2.6, que obviamente não possui todas as funcionalidades da última versão.
Brincando com a versão 1.2.6 uma das coisas que mais senti falta foi a possibilidade de converter o resultado de uma busca em um Hash. Nesta versão o máximo que podemos fazer é recuperar em XML ou em texto puro.
Para resolver este problema resolvi fuçar pelo código da versão mais nova e encontrei um trecho de código que poderia ajudar. Mas não quero alterar diretamente o fonte do gem (não recomendo fazer isto), por isto montei a seguinte classe:
[source:ruby]
require ‘rubygems’
require ‘scrubyt’
module Scrubyt
class ResultDumper
def self.to_hash(pattern)
result = []
flat_hash_inner = lambda {|e, parts|
content = e.text ? REXML::Text.unnormalize(e.text) : ”
if ((e.is_a? REXML::Element) && content != ”)
if parts[e.local_name]
parts[e.local_name] = parts[e.local_name] + “,” + content
else
parts[e.local_name] = content
end
end
e.children.each {|c| flat_hash_inner.call(c, parts) if c.is_a? REXML::Element }
parts
}
to_xml(pattern).root.elements['/root'].each {|e| result << flat_hash_inner.call(e, {}) }
result
end
def self.to_csv(pattern)
result = []
flat_csv_inner = lambda {|e, parts|
content = e.text || ''
parts << content if ((e.is_a? REXML::Element) && content != '')
e.children.each {|c| flat_hash_inner.call(c, parts) if c.is_a? REXML::Element }
parts
}
to_xml(pattern).root.elements['/root'].each {|e| result << flat_csv_inner.call(e, []) }
(result.map! {|a| a.join(',')}).join("\n")
end
end
end
[/source]
Incluindo isto no projeto, podemos pegar o retorno da pesquisa em formato CVS ou em um Hash da mesma forma como fazemos com os métodos to_xml e to_text.
Se você não entendeu nada deste post, dê uma olhada de leve no scRUBYt!, tenho certeza de que você vai gostar.