【问题标题】:Ruby Mechanize form input field textRuby Mechanize 表单输入字段文本
【发布时间】:2015-07-26 12:49:24
【问题描述】:

已解决 - "abc = list.scan(/[([^)]+)]/).last.first" 行是正确的,但也包含了网站搜索表单不接受的引号。更正为 abc = list.scan(/\"([^)]+)\"/).join。

感谢大家的帮助。


我必须使用 csv 文件中包含 100 个关键字的列表来自动进行搜索。

使用 Mechanize,我可以使用此示例 (http://mechanize.rubyforge.org/GUIDE_rdoc.html) 提交搜索:

agent = Mechanize.new
page = agent.get('http://google.com/')
google_form = page.form('f')
google_form.q = 'ruby mechanize'
page = agent.submit(google_form)
pp page

但是,当我让它遍历 csv 文件时,它会返回一个错误(在本例中,第一个 csv 条目将是“ruby mechanize”:

#i have already imported the csv list, now it is looping through the array "raw_list"

raw_list.each do |list|
abc = list.scan(/\[([^\)]+)\]/).last.first

# i tested a "puts abc" which returned "ruby mechanize", so I don't understand why the rest of this doesn't work


agent = Mechanize.new
page = agent.get('http://google.com/')
google_form = page.form('f')
google_form.q = abc

#even though abc = "ruby mechanize", an error occurs. 


page = agent.submit(google_form)
pp page

它似乎没有使用变量 "abc",但如果您手动输入 'ruby mechanize' 则可以工作,即使两者相同。 p>

出现的错误是:

C:filename: in `block (2 levels) in <top (required)>': undefined method `text' for nil:NilClass (NoMethodError)
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/mechanize-2.7.3/lib/mechanize.rb:442:in `get'
from C:/Users/victor/RubymineProjects/untitled/scraper.rb:23:in `block in <top (required)>'
from C:/Users/victor/RubymineProjects/untitled/scraper.rb:19:in `each'
from C:/Users/victor/RubymineProjects/untitled/scraper.rb:19:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'

任何帮助将不胜感激。

【问题讨论】:

  • 发布错误可能会有所帮助:)
  • 如果没有看到行号,我就不能说太多。我的猜测是你得到一个没有表单的页面(其中一个“我们认为你是机器人”页面)

标签: ruby csv automation web-scraping mechanize


【解决方案1】:

您的错误是告诉您代码中第 19 行的某些内容导致了 mechanize 中第 442 行的问题。

我在 IRB 中试用了您的示例,它似乎工作正常:

2.2.2 :001 > require 'mechanize'
 => true 
2.2.2 :002 > agent = Mechanize.new
 => #<Mechanize:...
2.2.2 :003 > page = agent.get('http://google.com/')
 => #<Mechanize::Page
  ...
2.2.2 :004 > google_form = page.form('f')
 => #<Mechanize::Form
 ...
2.2.2 :005 > google_form.q
 => "" 
2.2.2 :006 > abc = "ruby mechanize"
 => "ruby mechanize" 
2.2.2 :007 > google_form.q = abc
 => "ruby mechanize" 
2.2.2 :008 > page = agent.submit(google_form)
 => #<Mechanize::Page
 ...

如果未找到任何内容,Scan 将返回 nil,因此您的错误在这里发生:

abc = list.scan(/\[([^\)]+)\]/).last.first

http://ruby-doc.org/stdlib-2.2.0/libdoc/strscan/rdoc/StringScanner.html

您可以将其替换为:

abc = list.scan(/\[([^\)]+)\]/).join

你总是会得到一个字符串,虽然它可能只是 ""。

http://ruby-doc.org/core-2.2.0/Array.html#method-i-join

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2017-08-24
    • 2013-05-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多