ror Mechanize困惑不解

时间:2009-12-08 04:12:08

标签: ruby-on-rails ruby mechanize

我正在尝试使用 mechanize 对我的大学课程计划数据库执行简单搜索。以下代码返回nil,但它可以登录到facebook并搜索google(使用diff url / params)。我做错了什么?

我正在关注最新的(伟大的)railscast here。机械化文档很有用,但我仍然感到困惑。提前感谢您的建议!

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
=> []

2 个答案:

答案 0 :(得分:0)

当通过WWW :: Mechanize查询时,页面返回null结果。

我不确定WWW :: Mechanize是否可以处理POSTING到这个安全页面。

“无法将nil转换为字符串”意味着它无法以文本形式向您显示什么都没有。它无法从零开始转换。

表单和脚本延迟也可能存在问题。

尝试使用curl进行调试,POST等curl -d "occ_subject=chm" https://www.owens.edu/cgi-bin/class.pl,当我尝试返回页面时。

我认为这是安全页面和cgi脚本组合的问题。

答案 1 :(得分:0)

form.submit.search删除搜索,即form.submit我猜你正在追加搜索提交认为它与提交按钮的值有关,即搜索。

您的代码正在做什么IS成功提交表单。但是,您使用nil参数调用结果页面对象的搜索方法。搜索方法需要一个选择器,例如'body div#nav_bar ul.links li'作为参数,返回与该选择器匹配的元素数组。当然,没有元素会匹配nil选择器,因此是空数组。

根据您的回复进行修改:

您的代码:

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
=> []

我尝试过并开始工作:

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

相同的代码也不适用于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"
   …

页面对象的搜索方法的行为类似于Nokogiri的搜索方法,因为它接受一系列CSS选择器和/或XPath查询,并返回匹配元素的可枚举对象。 e.g。

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