Tag Archives: RoR

Read third party HTML using Ruby on Rails and Hpricot

A few weeks ago, mi Distributed Systems class profesor asked us to implement some sort of Web Service that gave Currency Rates information in XML format. This looked pretty easy, but all went wrong when he asked us to read the HTML from a bank’s web site and retrieve the information from there.
The idea then was to read that HTML code from a reliable site, transform it and make it available for us to download or use. Looking for a free web service that presented this information and using it wouldnt have been as easy as it was for me to use Hpricot. So here is the code I wrote, I just changed the url from where i fetched the information, because I don’t know if it is legal to do that :D.

First there is the model CurrencyService
currency_service.rb
require ‘open-uri’
require ‘hpricot’

class CurrencyService “”},
{:CUR_CODE => “USD”, :MEX_EQV => get_data(”#FIX_DATA”).gsub(/ /,”).chomp},
{:CURRENCY_EQV => “”},
{:CUR_CODE => “EUR”, :MEX_EQV => get_data(”#EURO_DATA”).gsub(/ /,”).chomp},
{:CURRENCY_EQV => “”},
{:CUR_CODE => “YEN”, :MEX_EQV => get_data(”#YEN_DATA”).gsub(/ /,”).chomp},
{:CURRENCY_EQV => “”},
{:CUR_CODE => “CAN”, :MEX_EQV => get_data(”#LIBRA_DATA”).gsub(/ /,”).chomp}
}.to_xml
end

end

And then the controller

curency_service_controller.rb
class CurrencyServiceController “text/xml”,
:filename => “currencies.xml” )
end

end

Enjoy

Advertisements

Leer HTML de un sitio externo con Ruby on Rails y Hpricot

Hace un par de semanas mi profesor de Sistemas Distribuidos en el ITESO nos pidió hacer una especie de Web Service que te entregara información del mercado cambiaro en formato XML. Esto sonaba bastante sencillo, sin embargo todo se complicó cuando nos pidio información real tomada de la página de un banco, debiamos leerla en HTML.
La idea entonces era leer el código HTML de una página web confiable que presentara esta información y nosotros convertirla en XML con el formato solicitado. Al principio si le batalle en buscar mejor un Web Service ya hecho y gratuito que presentara esta información, sólo encontre uno aqui, sin embargo no pude encontrar un API ni nada parecido que me facilitara el uso.
Para este momento ya tenia el tiempo encima así que como de costumbre acudí a la comunidad de RoR para ver que herramientas tenía a la mano para leer HTML. Me encontré con Hpricot que es un gem que me solucionó la vida. La solución final quedo muy simple.

Primero hize un modelo CurrencyService que se conecta con el sitio web del que obtuve la información, lo lee como un string y este lo convierte a un Hpricot, después usando la librería Hpricot busca por ID los datos que se necesitan, el controlador simplemente presenta la información en formato XML y listo. Aqui dejo el código, solo que no revelaré la fuente de información ya que no se si es legal.

currency_service.rb
require ‘open-uri’
require ‘hpricot’

class CurrencyService < ActiveRecord::Base
def get_data(id)
html = Hpricot(open("http://www.urlfalso.fake").read)
return (html/id).inner_html
end

def get_xml_content
@currencies = {
{:CURRENCY_EQV => ""},
{:CUR_CODE => "USD", :MEX_EQV => get_data("#FIX_DATO").gsub(/ /,'').chomp},
{:CURRENCY_EQV => ""},
{:CUR_CODE => "EUR", :MEX_EQV => get_data("#EURO_DATO").gsub(/ /,'').chomp},
{:CURRENCY_EQV => ""},
{:CUR_CODE => "YEN", :MEX_EQV => get_data("#YEN_DATO").gsub(/ /,'').chomp},
{:CURRENCY_EQV => ""},
{:CUR_CODE => "CAN", :MEX_EQV => get_data("#LIBRA_DATO").gsub(/ /,'').chomp}
}.to_xml

end

end

curency_service_controller.rb
class CurrencyServiceController < ApplicationController

def index
@currency_service = CurrencyService.new
send_data( @currency_service.get_xml_content, :type => "text/xml",
:filename => "currencies.xml" )
end

end

Asi de simple es…