2012-07-24 114 views
0

我一直在研究一些方法並在控制檯中測試它們。問題是在服務器上運行時發生錯誤。具體地,第一方法下面觸發此NoMethod錯誤:Rails webscraper在控制檯中工作,但不是服務器

undefined method `text' for nil:NilClass 

下面的代碼。它來自webpage.rb文件,它有一個uri列。

def download_page_title 
    page_as_xml.at_css('title').text 
end 

def page_as_xml 
    page_as_xml ||= Nokogiri::HTML(open(page_uri)) 
end 

def page_uri 
    base_uri = Site.find_by_id(self.site_id).homepage #always has "/" at end 
    if self.url == base_uri 
    page_uri = base_uri 
    else 
    page_uri = "#{base_uri}#{self.url}" 
    end 
end 

任何想法我做錯了什麼?此外,任何想法爲什麼事情順利在控制檯,但在服務器上出軌?

編輯:這裏是我在控制檯中做的一個例子。

1.9.3p194 :262 > a = Webpage.new(url: "http://www.cnn.com/", site_id:165) 
=> #<Webpage id: nil, url: "http://www.cnn.com/", site_id: 165, created_at: nil, updated_at: nil, title: nil> 
1.9.3p194 :263 > a.download_page_title 
    Site Load (0.3ms) SELECT "sites".* FROM "sites" WHERE "sites"."id" = 165 LIMIT 1 
=> "CNN.com - Breaking News, U.S., World, Weather, Entertainment & Video News" 
+1

你究竟在工作的控制檯上運行了什麼? – Dty 2012-07-24 15:52:54

+0

如果我建立了一個新的網站,給它一個像「http://www.cnn.com」這樣的網址,然後保存,那麼我可以成功調用download_page_title方法。 – 2012-07-24 15:56:26

回答

1

這意味着page_as_xml.at_css正在恢復nil,然後你想叫.textnil對象。

那麼,找出爲什麼這是返回nil。例如,您下載的頁面是否未指定可通過CSS選擇器訪問的title標籤?該頁面是空白還是不返回結果?它是否返回錯誤狀態(不在2xx HTTP狀態範圍內)?

換句話說,您用於測試的頁面與服務器實際獲得的頁面之間可能存在上游差異。

您可能需要處理(或拋出異常或記錄/報告)頁面,該頁面會將nil從呼叫返回page_as_xml.at_css--這確實取決於您的軟件需要執行的操作。

+0

我在控制檯中使用與我在本地運行應用程序時相同的頁面。但是,是的,我同意我最終需要一些異常處理。我只是想先讓它正常工作。 – 2012-07-24 15:59:51

+0

如果您在測試和生產中使用相同的頁面,那麼您需要發佈一些關於如何設置/檢索頁面的詳細信息,並證明在生產中調用第一種方法之前它不是'nil'。如果在調用第一個方法之前無法證明頁面已經不是'nil',那麼在該方法調用被放置之前可能會發生問題。 – jefflunt 2012-07-24 16:03:34

+0

是的,你說得對。在我開始使用webscraping代碼之前,我們還有一種無價值的方式。良好的見解。謝謝。 – 2012-07-24 16:30:05

相關問題