0

我正在学习编程,所以我一直在想一些随机的项目。我决定制作一个脚本来下载我在过去几年中收集的所有 GIF。一切似乎都在工作,除了我在中途收到一个错误,我的错误处理没有捕获(无效的访问模式“wb”,“ArgumentError URI:HTTP 资源是只读的)。我已经摆弄了一天多无法获得这项工作任何帮助或提示将不胜感激。

require 'json', 'open-uri'    
def download

file = open("C:/sites/bookmark/gifs.json")
json = file.read

parsed = JSON.parse(json)

gifs = parsed["children"]
file.close()
total = 0
gifsize = 0
    gifs.each do |key|

        source = "#{key["uri"]}"
        source.chomp
        gifname = "#{key["title"]}"
        gifname.gsub(/[^0-9a-z ]/i, '')
        open("#{gifname}.gif", "wb") do |file|

            begin
              open(source)                  
            rescue Exception => e
                case e.message
                    when /404/ then puts '404!' 
                    when /505/ then puts '505!'
                    when /408/ then puts '408!'
                    else puts 'idk #{e.message}'
                end
                file.close()
                File.delete("#{gifname}.gif")
                puts "Deleted #{key["title"]}.gig"
                next
            end

            open(source) do |uri|

                file.write(uri.read)
                total += 1
                gifsize += (uri.size / 1024)
                print "#{(uri.size)/1024} KiloBytes"
            end
            print " --- #{total}"
        end
        puts " next gif---"
    end
    puts "\n#{gifsize} Total KB Downloaded \n#{total} Total Gifs "

end

download()

谢谢

4

1 回答 1

1

该行gifname.gsub(/[^0-9a-z ]/i, '')实际上并没有做任何事情,因为该方法String#gsub不会修改字符串,而是返回一个修改后的字符串。您需要String#gsub!改用: gifname.gsub!(/[^0-9a-z ]/i, '')

因此,gifname它可能是一个 HTTP URL,并且open-uri无法在写入模式下打开它,如错误消息所述。

为了调试这种问题,你应该运行 ruby​​ 调试器,或者放一堆puts语句来检查你的变量的内容。

于 2013-03-21T23:25:46.833 回答