ruby获取url内容始终为空

Jef*_*eff 0 ruby python url http

我很沮丧,试图使用Ruby来获取特定的url内容.

我尝试了许多不同的方式,比如open-uri,标准请求到目前为止都没有.我总是得到空的HTML.我还尝试使用python来获取始终返回正确html内容的相同url.我真的不确定为什么......请帮助我,因为我对Ruby和Python都是新手... 我想使用Ruby(更喜欢整洁的语法和人性化的函数名称,更容易使用gem和homebrew安装libs(在mac上) )比python easy_install)但我现在正在考虑Python,因为它只是工作(但仍然试图让我的头围绕2.x和3.x问题).我可能会做一些非常愚蠢的事情,但我认为这是不太可能的.

ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-darwin10.6.0]

实施1:

url = URI.parse('http//:www.stackoverflow.com/') req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
puts res.body #empty
Run Code Online (Sandbox Code Playgroud)

实施2:

doc = Nokogiri::HTML(open("http//:www.stackoverflow.com/", "User-Agent" => "Safari"))
#empty
#I tried to use without user agent, without Nokogiri none worked.
Run Code Online (Sandbox Code Playgroud)

Python实现每次都很完美

f = urllib.urlopen("http//:www.stackoverflow.com/")
# Read from the object, storing the page's contents in 's'.
s = f.read()
f.close()

print s
Run Code Online (Sandbox Code Playgroud)

Mic*_*ile 5

如果这是您的确切代码,则由于多种原因无效.

  1. http:应该是http://
  2. URL需要一个路径.如果你想要example.com的根页面,它需要是http://example.com/,那么尾随斜杠很重要.
  3. 如果你在一行上放两行代码就需要使用; 表示第一行的结尾

所以

require 'net/http'

url = URI.parse('http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
puts res.body
Run Code Online (Sandbox Code Playgroud)

在nokogiri中使用open也是如此

编辑:该网站多次返回不良结果:

counter = 0

20.times do
  url = URI.parse('http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia')
  req = Net::HTTP::Get.new(url.path)
  res = Net::HTTP.start(url.host, url.port) {|http|   http.request(req) }    
  sleep 1
  counter +=1 unless res.body.empty?
end

puts counter
Run Code Online (Sandbox Code Playgroud)

对我来说,这只是一次非空身体的回归.如果你在另一个站点替换它,它一直在工作

curl "http://www.yellowpages.com.au/search/listings?clue=plumber&locationClue=Australia"
Run Code Online (Sandbox Code Playgroud)

产生相同的不一致结果.