我知道这是一个非常简单的问题,但是我已经被卡住了一个小时,我就是不明白这是如何工作的。
我需要刮一些东西从我的学校的图书馆,所以我需要插入'CE'到文本字段,然后点击一个链接与文本'Clasificación'。输出是我要用来工作的。这是我的代码。
require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'mechanize'
url = 'http://biblio02.eld.edu.mx/janium-bin/busqueda_rapida.pl?Id=20110720161008#'
searchStr = 'CE'
agent = Mechanize.new
page = agent.get(url)
searchForm = page.form_with(:method => 'post')
searchForm['buscar'] = searchStr
clasificacionLink = page.link_with(:href => "javascript:onClick=set_index_and_submit('51');").click
page = agent.submit(searchForm,clasificacionLink)
当我运行它时,它给了我这个错误
janium.rb:31: undefined method `[]=' for nil:NilClass (NoMethodError)
谢谢!
我认为你的问题实际上是在第13行,而不是31行,我甚至会告诉为什么我这样认为。您的脚本不仅没有31行,而且,从精细的手册:
form_with(标准)
查找匹配条件的单个表单
该页上有几个表单有method="post"
。显然,机械化返回nil
时,它不能完全匹配form_with
标准,包括单个部分在文档中提到;因此,如果您的criteria
匹配多个事物,form_with
返回nil
而不是选择其中一个选项,您最终尝试这样做:
nil['buscar'] = searchStr
但是nil
没有[]=
方法,所以你得到了NoMethodError
。
如果你使用这个:
searchForm = page.form_with(:name => 'forma')
您将通过第一部分,因为在该页上只有一个带有name="forma"
的表单。
clasificacionLink = page.link_with(:href => "javascript:onClick=set_index_and_submit('51');").click
page = agent.submit(searchForm, clasificacionLink)
as Mechanize不知道如何使用JavaScript(至少我的不知道)。但是如果你只用这个:
page = agent.submit(searchForm)
你会得到一个page
,然后你可以继续构建和调试你的脚本。
我的回答听起来很合理。我不确定这是否严格必要,但您也可以尝试在searchStr
周围加上大括号。
searchForm['buscar'] = [searchStr]