Carlos Brando

Nome do Jogo

scRUBYt! no Windows não tem Hash

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.

Comments