的Ruby/Rails - 错误的URI

问题描述:

不知道为什么我收到以下错误时,URI工作在浏览器就好了:的Ruby/Rails - 错误的URI

http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps 

这是我的代码:

def kb(to) 

    uri = "http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=#{to.strip}&u=1&p=google-apps" 
    doc = Nokogiri::XML(open(uri)) # throws error on this line 

    return parse(doc) 
end 

我得到以下错误:

in `split': bad URI(is not URI?): http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps (URI::InvalidURIError)` 

我以下列方式执行方法:

kb("Tom Cruise") 
+0

向我们展示一些代码 – 2012-01-03 08:24:29

这是因为浏览器对病态友好,就像一只小狗,并且会竭尽全力来呈现网页或解析网址。一个应用程序不会那样做,因为你必须告诉它如何友好。

您的网址无效,因为它包含空格。与%20更换空间:

irb -f 
irb(main):001:0> require 'open-uri' 
=> true 
irb(main):002:0> open('http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=Tom%20Cruise&u=1&p=google-apps').read 
=> "<?xml version=\"1.0\" standalone=\"no\"?>\n<link><actor>Tom Cruise</actor><movie>A Few Good Men (1992)</movie><actor>Kevin Bacon</actor></link>" 

转义字符需要进行转义很简单:

irb -f 
irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> URI.escape('http://oracleofbacon.org/cgi-bin/xml?a=Kevin Bacon&b=Tom Cruise&u=1&p=google-apps') 
=> "http://oracleofbacon.org/cgi-bin/xml?a=Kevin%20Bacon&b=Tom%20Cruise&u=1&p=google-apps" 
+0

工作一种享受,谢谢。我做了以下,但我敢肯定,有一个更清洁的方式,用%20替换空间:'#{to.strip.gsub(“”,“%20”)}' – fuzz 2012-01-03 08:37:12

+0

@Fulvio'require'cgi “; CGI :: escape(“'Stop!'说Fred”)#=>“%27Stop%21%27 +说+ Fred”([doc](http://ruby-doc.org/stdlib-1.9.3 /libdoc/cgi/rdoc/CGI.html#method-c-escape))。 (或者rails中的'h'辅助方法)。 – steenslag 2012-01-03 08:45:53

+0

@Fulvio,我添加了代码来显示如何处理字符串转义。如果您知道只有一个字符需要替换,则使用'gsub'即可。除此之外,您应该利用预先发明的轮子并使用[URI](http://rubydoc.info/stdlib/uri/frames)或[可寻址](http://rubydoc.info/gems/addressable) /帧)宝石,这是非常全面的。 – 2012-01-03 08:53:31