Ruby open-uri, возвращает ошибку при открытии png-URL - PullRequest
0 голосов
/ 26 февраля 2010

Я делаю гусеничный разбор изображений на манге Ганца в http://manga.bleachexile.com/gantz-chapter-1.html и далее.

У меня был успех, пока мой сканер не попытался открыть изображение (в главе 273):

неверный URI (не URI?): http://static.bleachexile.com/manga/gantz/273/Gantz[0273]_p001[Whatever-Illuminati].png

НО этот URL действителен, я думаю, потому что я могу открыть из Firefox .. Есть мысли?

Неполный код:

img_link = nav.page.image_urls.find {|x| x.include?("manga/gantz")}
img_name = RAILS_ROOT+"/public/#{nome}/#{cap}/"+nome+((template).sub('::cap::', cap.to_s).sub('::pag::', i.to_s))
img = File.new( img_name, 'w' )
img.write( open(img_link) {|f| f.read} )
img.close

1 Ответ

1 голос
/ 26 февраля 2010

Это не действительный URI. Только определенные символы разрешены для URI. Кстати, Firefox, как и все браузеры, старается сделать для пользователя как можно больше, вместо того, чтобы жаловаться, когда он не выглядит стандартно.

Действует в следующей форме:

open("http://static.bleachexile.com/manga/gantz/273/Gantz%5B0273%5D_p001%5BWhatever-Illuminati%5D.png") # => #<File:/tmp/open-uri20100226-3342-clj08a-0>

Вы можете попытаться избежать этого следующим образом:

uri.gsub(/\/.*/) do |t|
  t.gsub(/[^.\/a-zA-Z0-9\-_ ]/) do |c|
    "%#{ c[0]<16 ? "0" : "" }#{ c[0].to_s(16).upcase }"
  end.gsub(" ", "+")
end

Но будьте осторожны, если на сайте используются правильные экранированные URI, и вы избегаете их во второй раз. Ури больше не будет указывать на одно и то же место.

...