Manipulando HTML y XML con Ruby y Hpricot
alfredo publicó esto el 11/12/08 en Ruby. Un comentarioUno 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&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=inteligencia&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í
[...] Talueee's Blog Just another WordPress.com weblog « Turorial de Ruby. Manipulando HTML y XML con Ruby y Hpricot Marzo 1, 2010 Link a página [...]