Pregunta

estoy tratando de usar mecanizar para realizar una búsqueda simple en la base de datos del horario de clases de mi universidad.El siguiente código devuelve cero, sin embargo, funciona iniciando sesión en Facebook y buscando en Google (con diff url/params).¿Qué estoy haciendo mal?

Estoy siguiendo el último (excelente) Railscast aquí.La documentación de Mechanize ha sido útil pero todavía estoy desconcertado.¡Gracias por adelantado por tus sugerencias!

ruby script/console
require 'mechanize'
agent = WWW::Mechanize.new
agent.get("https://www.owens.edu/cgi-bin/class.pl/")
agent.page.forms
form = agent.page.forms.last
form.occ_subject = "chm"
form.submit.search
=> []
¿Fue útil?

Solución

Eliminar búsqueda de form.submit.search es decir. form.submit Supongo que estás agregando búsqueda para enviar pensando que tiene algo que ver con el valor del botón de enviar, es decir.buscar.

Lo que hace su código ES enviar el formulario correctamente.Sin embargo, está llamando al método de búsqueda del objeto de página resultante con un argumento nulo.El método de búsqueda espera un selector, p.e. 'body div#nav_bar ul.links li' como argumento para que devuelva una matriz de elementos que coincidan con ese selector.Por supuesto, ningún elemento coincidirá con un selector nulo, de ahí la matriz vacía.

Edite según su respuesta:

Tu codigo:

ruby script/console
require 'mechanize'
agent = WWW::Mechanize.new
agent.get("https://www.owens.edu/cgi-bin/class.pl/")
agent.page.forms
form = agent.page.forms.last
form.occ_subject = "chm"
form.submit.search
=> []

Lo que probé y me puse a trabajar:

script/consola de Ruby

require 'mechanize'
agent = WWW::Mechanize.new
agent.get("https://www.owens.edu/cgi-bin/class.pl")
agent.page.forms
form = agent.page.forms.last
form.occ_subject = "chm"
form.submit # <- No search method.
=> Insanely long array of HTML elements

El mismo código tampoco funcionará con Google:

require 'mechanize'
require 'nokogiri'
agent = WWW::Mechanize.new
agent.get("http://www.google.com")
form = agent.page.forms.last
form.q = "stackoverflow"
a = form.submit.search
b = form.submit
puts a
=> [] # <--- EMPTY!

puts b
#<WWW::Mechanize::Page
 {url
  #<URI::HTTP:0x1020ea878 URL:http://www.google.co.uk/search?hl=en&source=hp&ie=ISO-8859-1&q=stackoverflow&meta=>}
 {meta}
 {title "stackoverflow - Google Search"}
 {iframes}
 {frames}
 {links
  #<WWW::Mechanize::Page::Link
   "Images"
   "http://images.google.co.uk/images?hl=en&source=hp&q=stackoverflow&um=1&ie=UTF-8&sa=N&tab=wi">
  #<WWW::Mechanize::Page::Link
   "Videos"
   …

El método de búsqueda de un objeto de página se comporta como el método de búsqueda de Nokogiri, en el sentido de que acepta una secuencia de selectores CSS y/o consultas XPath y devuelve un objeto enumerable de elementos coincidentes.p.ej.

page.search('h3.r a.l', '//h3/a[@class="l"]') 

Otros consejos

La página devuelve un resultado nulo cuando se consulta a través de WWW :: Mecanizar.

No estoy seguro de si WWW :: Mecanizar puede manejar exponer en esta página segura.

"no se puede convertir nula en cadena" significa que no se puede mostrar en un formato de texto lo que no hay nada. No puede convertir algo de la nada.

También podría haber un problema con la forma y el retraso de la escritura.

Trate de usar rizo para la depuración, fijando como curl -d "occ_subject=chm" https://www.owens.edu/cgi-bin/class.pl, cuando he intentado que volviera una página.

Creo que es un problema con la página segura y la secuencia de comandos CGI combinado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top