Closed mondras closed 11 years ago
script/beisbol.rb:37: invalid multibyte char (US-ASCII)
script/beisbol.rb:37: syntax error, unexpected $end, expecting ')'
fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]
agregué encoding utf-8 para resolver el bug anterior
http://stackoverflow.com/questions/1739836/invalid-multibyte-char-us-ascii-with-rails-and-ruby-1-9
Ahora:
/Users/Rod/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:35:in `initialize': No such file or directory - log/ifai.log (Errno::ENOENT)
¿Por qué moviste todo a la carpeta script? IMO, es mejor que cada script tenga su carpeta y su README.md específico
Podemos poner una carpeta por script pero tenerlas dentro de script le va a dar más orden si después generamos un modelo de datos y demás.
Al parecer el error del log es porque no hay una carpeta log jaja
Estaba corriendo el script con RUBYOPT=-Ku be ruby script/beisbol.rb para lo del UTF8
Agree sobre la carpeta /script, pero creo que vale la pena que cada script tenga su documentación (i.e. README.md)
El script debe crear el log file si no existe.
Crea el log file si no existe, lo que no crea es la carpeta. Deja la subo vacía y pongo los scripts en cada una de sus carpetas con su Readme.md
Carlos Mondragón
On Mon, Mar 18, 2013 at 8:13 AM, Rod Wilhelmy notifications@github.comwrote:
Agree sobre la carpeta /script, pero creo que vale la pena que cada script tenga su documentación (i.e. README.md)
El script debe crear el log file si no existe.
— Reply to this email directly or view it on GitHubhttps://github.com/CodeandoMexico/los-scrapers/pull/5#issuecomment-15060192 .
Como no vi documentación del curul pensé que no ibas a hacer un Readme.md por script
:+1:
aunque a veces truena si el response header viene vacío:
script/ifai/beisbol.rb:38:in block in <main>': undefined method
[]' for nil:NilClass (NoMethodError)
new_cookie = response.headers['set-cookie']
mmm, un if response.headers
no lo resolvió, tal vez sea que Nokogiri no encuentra el div#info en una de las páginas
Sí, me suena más bien a que no contestó bien HTTParty, quizás habría que ponerle un next si no encuentra div#info ¿Te pasa siempre en la misma página?
creo que faltan validaciones en cada match
fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]
Si no hay match (i.e. nil) lanza la excepción de que no hay method [] para nil
un method_missing no nos caería nada mal
Yo creo que está bien que se levante la excepción porque implica que está malformada la información y debemos de cambiar el script, ¿no te late?
Carlos Mondragón
2013/3/18 Rod Wilhelmy notifications@github.com
creo que faltan validaciones en cada match
fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]
Si no hay match (i.e. nil) lanza la excepción de que no hay method [] para nil
— Reply to this email directly or view it on GitHubhttps://github.com/CodeandoMexico/los-scrapers/pull/5#issuecomment-15063316 .
el manejo de la excepción podría ser o también monkey patching
class String
# siempre regresa al menos []
def match_regex(regex)
end
end
Mmm... Nos llenaríamos de datos basura con eso y no aplicaría para el propósito del script. ¿Truena muy seguido? A mí no me tronaba pero si ahorita está tronando estaría estaría bueno tener un retry/recovery strategy más bien.
agree, sería un rescue entonces
Y la pregunta es ¿qué hacemos en el rescue?
Este parche horrible me funcionó:
begin
monto = div.content.match(/monto de \$\s*(\d+([.,]\d+)*)/)[1]
razon = div.css('a').first.content
fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]
id = div.content.match(/con clave (.*) con el objeto/)[1]
dependencia = div.css('.tit-info').last.content
proveedor = div.content.match(/proveedor (.*) un /)[1]
fecha.gsub!(' ', '')
datos = { id:id, fecha: fecha, razon: razon, monto: monto,
dependencia: dependencia, proveedor: proveedor}
puts datos
contratos << datos
rescue NoMethodError
puts "No puedo parsear el contenido del documento"
end
Híjole, ¿pero ese no entiendo nos deja sin los datos no? Y eso no está chido.
si tronó el match es porque algo tiene el div#info diferente y de todos modos no podemos sacar los datos
¿No deberíamos de adaptarnos y sacar la info? ¿Puedes poner el div content cuando no entendió para analizarlo?
El div está aquí https://dl.dropbox.com/u/47709433/error.html
Lo capturé en el rescue
rescue NoMethodError
f = File.new('error.txt', 'w+')
f.puts doc.css('div#info')
f.close
end
En teoría alguno de los matchers truena ahí
Creo que es en la 2da página, porque el output fue json, nomethoderror, otro json
Puse erorres más descriptivos que nos van a ayudar a mejorar la extracción de datos y también ahora saca la moneda del contrato PESOS, EUROS y así. Ya no truena :) ¿cómo lo ves?
:+1:
yeah! ya no truena, y camina... we got a crawler!
también veo que la fecha la sacas de 2 redacciones posibles... good, después con un poco más de OO hacemos un strategy pattern o algo más fancy y re-usable.
yo creo que este pull request debería entrar a master ya
De acuerdo! Pues dale! jaja
Carlos Mondragón
2013/3/18 Rod Wilhelmy notifications@github.com
también veo que la fecha la sacas de 2 redacciones posibles... good, después con un poco más de OO hacemos un strategy pattern o algo más fancy y re-usable.
yo creo que este pull request debería entrar a master ya
— Reply to this email directly or view it on GitHubhttps://github.com/CodeandoMexico/los-scrapers/pull/5#issuecomment-15081234 .
Extendí
beisbol.rb
para que ahora más información y también la saque de TODAS las dependencias. Tuve que agregar HTTParty para usar cookies, la razón por la que a veces servían las páginas y a veces no era que el server checaba la cookie así que tuve que hacer un pequeño hack pero ya podemos scrapear a gusto :)Actualicé el Readme.MD con las cosas que creo hacen falta.
Modifiqué la estructura del proyecto para apegarse más a los estándares.
Creo también sería bueno también crearle clases y pruebas unitarias.