2009-12-08 105 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