标签: open-uri

Ruby open-uri重定向被禁止

我有这个简单的html解析器(用于学习目的),我一直在研究:

require 'open-uri'
puts "Enter URL to parse HTML: "
url = gets.chomp
puts "Enter tag to parse from: "
tag = gets.chomp
response = open(url).read
title1 = response.index(tag)
title2 = response.index(tag.insert(1,'/')) -1
result = response[(title1 + tag.length - 1)..title2]
print result 
Run Code Online (Sandbox Code Playgroud)

当我输入时http://twitter.com,我收到此错误消息:

ERROR: `open_loop': redirection forbidden: http://twitter.com -> https://twitter.com/ (RuntimeError)
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:149:in `open_uri'
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:704:in `open'
from /usr/local/rvm/rubies/ruby-2.1.4/lib/ruby/2.1.0/open-uri.rb:34:in `open'
from /home/ubuntu/workspace/htmlparse.rb:6:in `<main>' 
Run Code Online (Sandbox Code Playgroud)

有任何建议或帮助吗?我是Ruby新手,我知道其他html解析模块,但我这样做是为了学习Ruby基础知识.谢谢.

ruby open-uri

35
推荐指数
3
解决办法
2万
查看次数

如何在OpenURI中指定"http请求标头"

我试图使用Ruby的OpenURI gem调用URL,但是它需要我在其HTTP请求头中传递某些值.

知道怎么做吗?

ruby open-uri

33
推荐指数
1
解决办法
1万
查看次数

是否有解决方法在Ruby中打开包含下划线的URL?

我正在使用open-uri来打开URL.

resp = open("http://sub_domain.domain.com")
Run Code Online (Sandbox Code Playgroud)

如果它包含下划线,我会收到一个错误:

URI::InvalidURIError: the scheme http does not accept registry part: sub_domain.domain.com (or bad hostname?)

我理解这是因为根据RFC URL只能包含字母和数字.有没有解决方法?

ruby open-uri

32
推荐指数
4
解决办法
2万
查看次数

为什么Ruby open-uri打开在我的单元测试中返回一个StringIO,但在我的控制器中是一个FileIO?

我继承了一个Rails 2.2.2应用程序,用于在Amazon S3上存储用户上传的图像.基于attachment_fu的Photo模型提供了一种rotate方法,用于open-uri从S3和MiniMagick中检索图像以执行旋转.

rotate方法包含此行以检索用于MiniMagick的图像:

temp_image = MiniMagick::Image.from_file(open(self.public_filename).path)
Run Code Online (Sandbox Code Playgroud)

self.public_filename 返回类似的东西

http://s3.amazonaws.com/bucketname/photos/98/photo.jpg
Run Code Online (Sandbox Code Playgroud)

检索图像并旋转它在生产和开发中正在运行的应用程序中工作正常.但是,单元测试失败了

TypeError: can't convert nil into String
    /Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `initialize'
    /Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `open'
    /Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `from_file'
Run Code Online (Sandbox Code Playgroud)

原因是当在单元测试的上下文中调用模型方法时,open(self.public_filename)返回StringIO包含图像数据的对象.path此对象上的方法返回nilMiniMagick::Image.from_file爆炸.

当从该调用这个相同的模型方法时PhotosController,open(self.public_filename)返回FileIO绑定到例如名为的文件的实例,/tmp/open-uri7378-0并且该文件包含图像数据.

考虑原因必须是测试和开发之间的一些环境差异,我在开发环境下启动了控制台.但正如在单元测试中,open('http://...')返回一个StringIO,而不是一个FileIO.

我已经通过open-uri和所有相关的应用程序特定代码进行了跟踪,并且没有找到差异的理由.

ruby open-uri ruby-on-rails imagemagick amazon-s3

30
推荐指数
2
解决办法
8478
查看次数

如何使用open-uri发出POST请求?

是否可以使用open-uri从Ruby发出POST请求?

ruby open-uri

27
推荐指数
3
解决办法
2万
查看次数

如何使用open-uri处理503错误?

如果网站返回"503 service unavailable"错误,则open-uri会抛出异常.例如:

require 'open-uri'
open('http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8')
# OpenURI::HTTPError: 503 Service Unavailable
# ...
Run Code Online (Sandbox Code Playgroud)

但是,如果您随后在Web浏览器中访问它,它实际上会显示一个带有CAPTCHA而不是错误的页面.

我如何确保open-uri不仅仅将此作为异常,而是实际处理响应并向我提供页面内容?

ruby error-handling open-uri

26
推荐指数
1
解决办法
1万
查看次数

Nokogiri,open-uri和Unicode角色

我正在使用Nokogiri和open-uri来抓取网页上标题标签的内容,但是在重音字符方面遇到了麻烦.处理这些问题的最佳方法是什么?这是我正在做的事情:

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open(link))
title = doc.at_css("title")
Run Code Online (Sandbox Code Playgroud)

此时,标题如下所示:

抹布\ 303\271

代替:

肉酱

我怎样才能让nokogiri返回正确的字符(例如在这种情况下为ù)?

这是一个示例网址:

http://www.epicurious.com/recipes/food/views/Tagliatelle-with-Duck-Ragu-242037

ruby unicode screen-scraping open-uri nokogiri

25
推荐指数
4
解决办法
2万
查看次数

以字符串形式检索URL的内容

由于与Hpricot有关的繁琐工作,我需要编写一个传递URL的函数,并将页面的全部内容作为单个字符串返回.

快到了.我知道我需要使用OpenURI,它应该看起来像这样:

require 'open-uri'
open(url) {
  # do something mysterious here to get page_string
}
puts page_string
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我需要添加什么?

ruby open-uri

24
推荐指数
4
解决办法
4万
查看次数

Ruby的open-uri和cookies

我想从一个open-uri调用存储cookie并将它们传递给下一个.我似乎找不到合适的文档来做这件事.如果你能告诉我正确的方法,我会很感激.
注意:w3.org不是实际的网址,但它更短; 假装饼干在这里很重要.

h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot)
Run Code Online (Sandbox Code Playgroud)

2天后更新:虽然这不是一个修辞问题,但我保证这是可能的. 风滚草后更新:看(答案),这是可能的.花了我很多时间,但它的确有效.

ruby cookies open-uri

23
推荐指数
2
解决办法
2万
查看次数

快速获取远程图像尺寸的方法

我正在使用imagesize gem来检查远程图像的大小,然后只将足够大的图像推送到数组中.

require 'open-uri'
require 'image_size'
data = Nokogiri::HTML(open(url))
images = []
forcenocache = Time.now.to_i # No cache because jquery load event doesn't fire for cached images
data.css("img").each do |image|
  image_path = URI.join(site, URI.encode(image[:src]))
  open(image_path, "rb") do |fh|
    image_size = ImageSize.new(fh.read).get_size()
    unless image_size[0] < 200 || image_size[1] < 100
      image_element = "<img src=\"#{image_path}?#{forcenocache}\">"
      images.push(image_element)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我尝试在前端使用JS来检查图像尺寸,但似乎浏览器限制一次可以加载多少图像.

使用imagesize执行它比使用JS慢得多.有没有更好更快的方法呢?

ruby open-uri ruby-on-rails image

22
推荐指数
1
解决办法
9566
查看次数