我知道这是一个非常简单的问题,但我已经被困了一个小时,我无法理解这是如何运作的。
我需要从学校的图书馆中删除一些内容,因此我需要在文本字段中插入“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)
谢谢!
答案 0 :(得分:3)
我认为你的问题实际上是在第13行,而不是31,我甚至会告诉我为什么这么认为。您的脚本不仅没有31行,而且来自fine manual:
<强> 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)
因为Mechanize不知道如何处理JavaScript(至少我的不知道)。但如果你只使用这个:
page = agent.submit(searchForm)
您将获得page
,然后您可以继续构建和调试脚本。
答案 1 :(得分:1)
searchStr
附近添加大括号。
searchForm['buscar'] = [searchStr]