Manipulando HTML y XML con Ruby y Hpricot

alfredo publicó esto el 11/12/08 en Ruby. Un comentario

Uno de los problemas que tenemos cuando usamos aplicaciones web es que al mandar un comando HTTP al servidor a través del navegador, el servidor convierte los datos con los que debemos trabajar en gran cantidad de código HTML. Si necesitamos que nuestro programa pueda trabajar con esos resultados es necesario “desconvertir” el HTML en los tipos de datos que queremos como arrays, strings y otros objetos.

En este tutorial vamos a construir un script en Ruby que nos permita utlizar las sugerencias que nos da el buscador de Google cuando cree que escribimos mal lo que buscamos, el popular “Quizás quiso decir”, gracias a una librería poderosa, rápida y fácil de usar: Hpricot para la tarea de parsear HTML, todo esto utilizando una metodología de desarrollo evolutiva.

Por estos lugares ruby no es aún un lenguaje muy popular, asi que primero les voy a explicar como tener todo lo necesario como para empezar a trabajar.

Estas instrucciones son para Ubuntu Linux pero pueden adaptarse para cualquier otra distribucion, y en MS Windows debería ser aún mas fácil.

Primero vamos a instalar los paquetes de desarrollo y compiladores básicos en Linux, más el interprete de Ruby y sus librerias de desarrollo

sudo aptitude install build-essential ruby ruby1.8-dev irb rdoc

Una vez que terminamos, seguimos con el gestor de paquetes de Ruby: RubyGems

wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
tar -xvf rubygems-1.2-0.tgz
cd rubygems-1.2-0.tgz
sudo ruby setup.rb

Por ultimo instalamos el parseador de html Hpricot

sudo gem install hpricot

Ahora si, esta todo listo y podemos empezar con el desarrollo, de nuestro simple corrector ortográfico basado en google. Creamos un nuevo archivo ud_quiso_decir.rb en donde vamos a obtener el codigo fuente de un sitio y mostrarlo en pantalla, y a partir de aca vamos a hacer evolucionar el script

#importamos las librerias necesarias
require 'open-uri'
 
#abrimos la pagina deseada y mostramos su contenido por pantalla
puts open('http://www.google.com.ar').read

Guardamos y ejecutamos.

ruby ud_quiso_decir.rb

Si todo salió bien en la pantalla debería aparecer un monton de código html, el siguiente paso es abrir esa url con Hpricot para poder manipular el código fuente.

#importamos las librerias necesarias
require 'open-uri'
require 'rubygems'
require 'hpricot'
 
#definimos en una variable la url
url = 'http://www.google.com.ar'
 
#creamos un objeto hpricot a partir de la url
doc = Hpricot(open(url))
 
#mostramos el contenido limpio de tags html por pantalla
puts doc.to_plain_text

Ahora tenemos que revisar el código que devuelve google cuando tipeamos mal una palabra, para eso en el sitio de google buscamos algo incorrecto como hinteligencia, revisando el código vamos a encontrar que lo que buscamos:

<span style="color: #cc0000">Quizás quiso decir: </span>
<a href="/search?hl=es&amp;sa=X&amp;oi=spell&amp;resnum=0&amp;ct=result&amp;cd=1&amp;q=inteligencia&amp;spell=1">
<strong>
<em>inteligencia</em>
</strong>
</a>

Ahora sigamos mejorando nuestro script:

#importamos las librerias necesarias
require 'open-uri'
require 'rubygems'
require 'hpricot'
 
#tomamos el termino a buscar a traves de la linea de comando
search_word = ARGV[0]
url = "http://www.google.com.ar/search?q=#{search_word}"
 
#creamos un objeto hpricot a partir de la url
doc = Hpricot(open(url))
 
#buscamos dentro de la estructura de arbol
#hasta el lugar que queremos y dado que la
#busqueda en un documento devuelve un array
#solo tomamos el primer elemento
 
suggestion = (doc/"div#res/p/a/b/i").first
 
#por ultimo pasamos la sugerencia a texto plano
# y la mostramos a menos que google no nos haya sugerido nada
 
puts "Quizás quiso decir: " + suggestion.to_plain_text unless suggestion.nil?

Para los fanáticos de realizar todo en una sola línea de código, les mostramos como hacer en dos lí­neas este programa (sin contar los “require”).

suggestion = (Hpricot(open("http://www.google.com.ar/search?q=#{ARGV[0]}"))/"div#res/p/a/b/i").first
puts "Quizás quiso decir: " + suggestion.to_plain_text unless suggestion.nil?

Ahora sólo nos resta probar

alfredo@alfredo-laptop:~/dev/ruby$ ruby ud_quiso_decir.rb ruvy
Quizás quiso decir: ruby
alfredo@alfredo-laptop:~/dev/ruby$ ruby ud_quiso_decir.rb ruby
alfredo@alfredo-laptop:~/dev/ruby$

Esta poderosa librería no sólo permite parsear HTML sino tambien archivos XML y lo que mostramos acá es sólo una pequeña parte de todas sus funcionalidades que vamos a seguir profundizando en futuros posts.

El código fuente del ejemplo puede bajarse desde aquí­


Un comentario

Trackbacks and Pingbacks


Dejá un comentario

Imagen CAPTCHA CAPTCHA Audio
Refrescar imagen