2015-02-10 70 views
0

運行此代碼mecahnize 2.7.3和紅寶石2.3.0dev:NoMethodError從機械化

require 'mechanize' 
agent = Mechanize.new 

agent.keep_alive = false 
agent.open_timeout = 2 
agent.read_timeout = 2 
agent.ignore_bad_chunking = true 
agent.gzip_enabled = false 

url = 'http:%5C%5Cwww.scouts.org.uk' 

agent.head(url) 

使我這個NoMethodError:

~/.rvm/gems/ruby-head/gems/mechanize-2.7.3/lib/mechanize/http/agent.rb:648:in resolve': undefined  
methodlength' for nil:NilClass (NoMethodError) 

from ~/.rvm/gems/ruby-head/gems/mechanize-2.7.3/lib/mechanize/http/agent.rb:223:in `fetch' 
from ~/.rvm/gems/ruby-head/gems/mechanize-2.7.3/lib/mechanize.rb:459:in `head 

這是機械化的錯誤還是我做的有問題?如果是這樣如何解決?

編輯:網址顯然worng,但即時通訊從一個文件中讀取很多網址,其中一些可能是錯誤的。

EDIT2:可以說我有這樣的http://pastie.org/9934756 我需要得到所有的都是正確的URL的頭而忽略其他

+0

在與超時無變化10或20 – user1759796 2015-02-10 11:34:44

回答

1

你寫了一個錯誤的URL文件,試試這個:url = 'http://scouts.org.uk'

+0

我知道。但是有很多網址,其中一些可能是錯誤的。不應該錯誤是像404沒有找到或某些東西? – user1759796 2015-02-10 10:42:46

+0

@ user1759796您在「%5C%5C」中的錯誤 - 這是錯誤的網址,它看起來像:「http:// google.com/」,「http:// scouts.org.uk」等(沒有空格) – 2015-02-10 10:48:05

+0

看我的編輯。我知道該網址是錯誤的,我只需要正確處理它 – user1759796 2015-02-10 11:38:06

0

您的目標網站正在進行重定向並使用元刷新。更新您的代碼,包括那些方法:

require 'mechanize' 

agent = Mechanize.new 
agent.keep_alive = false 
agent.follow_meta_refresh = true 
agent.redirect_ok = true 
agent.open_timeout = 10 
agent.read_timeout = 10 
agent.ignore_bad_chunking = true 
agent.gzip_enabled = false 

url = 'http:%5C%5Cwww.scouts.org.uk' 

begin 
    page_head = agent.head(url) 
rescue Exception => exception 
    puts "Caught exception: #{exception.message}" 
end 

結果:

=> #Caught exception: undefined method `length' for nil:NilClass 
+0

這並沒有改變任何東西。您使用了正確的網址(不含%5c)。如果發生這種情況,我需要獲得一些我可以捕獲的錯誤,而不是一個nomethoderror。問題是我不知道是否所有的URL都有正確的格式 – user1759796 2015-02-10 11:36:33

+0

更新了代碼來捕捉異常。你如何處理它取決於你,我只是舉了一個基本的例子。更多關於[Ruby Exceptions](http://ruby-doc.org/core-1.9.3/Exception.html)和[異常處理](http://rubylearning.com/satishtalim/ruby_exceptions.html)。 – JonB 2015-02-10 12:36:27

+0

您可能還想查看[這篇文章](http://stackoverflow.com/questions/1805761/check-if-url-is-valid-ruby)。 – JonB 2015-02-10 12:47:28

0

您可以添加此方法來檢查有效的URL或不:

require 'uri' 
def valid?(url) 
    uri = URI.parse(url) 
    if uri.kind_of?(URI::HTTP) == true 
     puts '+' 
    else 
     puts '-' 
    end 
rescue URI::InvalidURIError 
    puts 'false ' 
end 

['http://web.de', 
'http://web.de/', 
'http:%5c%5cweb.de', 
'http:web.de', 
'foo://web.de', 
'http://we b.de', 
'http://|web.de'].each { |i| 
    valid?(i) 
} 

+

+

+

+

false

false

+0

對於OP提供的url,這將返回「true」,但不是。 – JonB 2015-02-10 12:54:36

+0

@JonB現在檢查它 – 2015-02-10 12:59:33

+0

是的,他們返回true,其中一些將在瀏覽器中工作,但機械化仍然不會加載它們。 – JonB 2015-02-10 13:03:49