如何使用ruby中的mechanize将字符串插入文本字段?

时间:2011-07-20 22:42:34

标签: ruby screen-scraping nokogiri mechanize nomethoderror

我知道这是一个非常简单的问题,但我已经被困了一个小时,我无法理解这是如何运作的。

我需要从学校的图书馆中删除一些内容,因此我需要在文本字段中插入“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)

谢谢!

2 个答案:

答案 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]