1

我知道这是一个非常简单的问题,但我已经被困了一个小时,我就是不明白这是如何工作的。

我需要从学校图书馆中抓取一些东西,所以我需要在文本字段中插入“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)

谢谢!

4

2 回答 2

3

我认为您的问题实际上在第 13 行,而不是第 31 行,我什至会告诉我为什么会这样。您的脚本不仅没有 31 行,而且来自精美的手册

form_with(criteria)
查找单个表单匹配条件。

该页面上有几种具有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然后你可以继续构建和调试你的脚本。

于 2011-07-21T00:00:26.870 回答
1

穆的回答听起来很合理。我不确定这是否是绝对必要的,但您也可以尝试在searchStr.

searchForm['buscar'] = [searchStr]
于 2011-07-31T10:39:12.567 回答