Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中使用mechanize向文本字段插入字符串?_Ruby_Screen Scraping_Nokogiri_Mechanize_Nomethoderror - Fatal编程技术网

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

如何在ruby中使用mechanize向文本字段插入字符串?,ruby,screen-scraping,nokogiri,mechanize,nomethoderror,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/bu

我知道这是一个非常简单的问题,但我已经被困了一个小时,我就是不明白这是怎么回事

我需要从我学校的图书馆里搜集一些资料,所以我需要在文本字段中插入“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行,而且:

用(标准)构成
查找单个表单匹配条件

该页面上有几个表单包含
method=“post”
。显然,当Mechanize无法将
表格与
标准(包括文档中提到的单个部分)精确匹配时,Mechanize返回
nil
;因此,如果您的
标准
与多个内容匹配,
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)

你将得到一个
页面,然后你可以继续构建和调试你的脚本。

我认为你的问题实际上在第13行,而不是第31行,我甚至会告诉你我为什么这么认为。您的脚本不仅没有31行,而且:

用(标准)构成
查找单个表单匹配条件

该页面上有几个表单包含
method=“post”
。显然,当Mechanize无法将
表格与
标准(包括文档中提到的单个部分)精确匹配时,Mechanize返回
nil
;因此,如果您的
标准
与多个内容匹配,
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)

您将获得一个
页面
,然后可以继续构建和调试脚本。

mu的回答听起来很合理。我不确定这是否绝对必要,但您也可以尝试在
searchStr
周围加上大括号

searchForm['buscar'] = [searchStr]

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

searchForm['buscar'] = [searchStr]