我有这个简单的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的OpenURI gem调用URL,但是它需要我在其HTTP请求头中传递某些值.
知道怎么做吗?
我正在使用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只能包含字母和数字.有没有解决方法?
我继承了一个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此对象上的方法返回nil并MiniMagick::Image.from_file爆炸.
当从该调用这个相同的模型方法时PhotosController,open(self.public_filename)返回FileIO绑定到例如名为的文件的实例,/tmp/open-uri7378-0并且该文件包含图像数据.
考虑原因必须是测试和开发之间的一些环境差异,我在开发环境下启动了控制台.但正如在单元测试中,open('http://...')返回一个StringIO,而不是一个FileIO.
我已经通过open-uri和所有相关的应用程序特定代码进行了跟踪,并且没有找到差异的理由.
如果网站返回"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不仅仅将此作为异常,而是实际处理响应并向我提供页面内容?
我正在使用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
由于与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)
任何人都可以建议我需要添加什么?
我想从一个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天后更新:虽然这不是一个修辞问题,但我保证这是可能的. 风滚草后更新:看(答案),这是可能的.花了我很多时间,但它的确有效.
我正在使用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慢得多.有没有更好更快的方法呢?