2009-12-08 109 views
0

我想用机械来执行一个简单的搜索我大学的课程表db。下面的代码返回nil,但它可以登录到Facebook并搜索谷歌(使用diff url/params)。我究竟做错了什么?由ror Mechanise感到困惑

我跟随最新的(伟大的)railscast here。机械化文档很有用,但我仍然感到困惑。在此先感谢您的建议!

ruby script/console 
require 'mechanize' 
agent = WWW::Mechanize.new 
agent.get("https://www.owens.edu/cgi-bin/class.pl/") 
agent.page.forms 
form = agent.page.forms.last 
form.occ_subject = "chm" 
form.submit.search 
=> [] 

回答

0

form.submit.search删除搜索,即form.submit我猜你正在追加搜索以提交它认为它与提交按钮的值有关,即搜索。

你在做什么代码是成功提交表单。但是,您正在使用零参数调用生成的页面对象的搜索方法。搜索方法期望一个选择器,例如'body div#nav_bar ul.links li'作为参数返回匹配该选择器的元素数组。当然,没有元素将匹配一个零选择器,因此是空的数组。按您回应

编辑:

您的代码:

ruby script/console 
require 'mechanize' 
agent = WWW::Mechanize.new 
agent.get("https://www.owens.edu/cgi-bin/class.pl/") 
agent.page.forms 
form = agent.page.forms.last 
form.occ_subject = "chm" 
form.submit.search 
=> [] 

我尝试和开始工作:

Ruby脚本/控制台

require 'mechanize' 
agent = WWW::Mechanize.new 
agent.get("https://www.owens.edu/cgi-bin/class.pl") 
agent.page.forms 
form = agent.page.forms.last 
form.occ_subject = "chm" 
form.submit # <- No search method. 
=> Insanely long array of HTML elements 

相同的代码会不适用于Google:

require 'mechanize' 
require 'nokogiri' 
agent = WWW::Mechanize.new 
agent.get("http://www.google.com") 
form = agent.page.forms.last 
form.q = "stackoverflow" 
a = form.submit.search 
b = form.submit 
puts a 
=> [] # <--- EMPTY! 

puts b 
#<WWW::Mechanize::Page 
{url 
    #<URI::HTTP:0x1020ea878 URL:http://www.google.co.uk/search?hl=en&source=hp&ie=ISO-8859-1&q=stackoverflow&meta=>} 
{meta} 
{title "stackoverflow - Google Search"} 
{iframes} 
{frames} 
{links 
    #<WWW::Mechanize::Page::Link 
    "Images" 
    "http://images.google.co.uk/images?hl=en&source=hp&q=stackoverflow&um=1&ie=UTF-8&sa=N&tab=wi"> 
    #<WWW::Mechanize::Page::Link 
    "Videos" 
    … 

页面对象的搜索方法的行为类似于Nokogiri的搜索方法,因为它接受一系列CSS选择器和/或XPath查询,并返回匹配元素的可枚举对象。例如

page.search('h3.r a.l', '//h3/a[@class="l"]') 
+0

您好。我不确定你是什么意思。上面的代码“=> []”指的是我输入提交后返回的值。 你如何将参数传递给搜索?这段代码适用于没有参数的Facebook和谷歌,为什么他们在这里是必要的? – 2009-12-08 15:27:29

+0

好的。我会暂时接受答案。然而,“非常长的HTML元素阵列”,生成的只是再生的形式(就大学而言)。提交后返回的信息是= agent.page.forms。在浏览器中进行真正的搜索会产生大量的类,并且不同意这种返回。我将.search添加到form.submit中,因为我不确定如果我真的在提交表单或使用submit命令触击清除按钮。显然,错误的道路。 还剩下机械化不会返回有关owens的任何有效信息。它可以是https或cgi吗? – 2009-12-08 21:03:31

+0

就我个人而言,我认为这是网站特有的问题。我不确定这是否是HTTPS问题,尽管我怀疑这是机械化原本应该如此使用的原因。无论如何,你的问题让我非常恼火,所以我会深入研究一下,看看我能不能达到底线。 – 2009-12-08 21:10:34

0

当通过WWW :: Mechanize查询时,页面返回空结果。

我不确定WWW :: Mechanize是否可以处理POSTING到这个安全页面。

“无法将nil转换为字符串”意味着它无法以文本形式显示您什么都不是。它不能从无到有。

它也可能是一个形式和脚本延迟的问题。

尝试使用curl进行调试,POSTing如curl -d "occ_subject=chm" https://www.owens.edu/cgi-bin/class.pl,当我试图返回一个页面。

我认为这是一个安全页面和CGI脚本相结合的问题。

+0

为POST使用CURL形式正确的方法是'卷曲-d “occ_subject = CHM” https://开头www.owens.edu /的cgi-bin/class.pl' – 2009-12-08 17:53:46