下载时如何为文件添加扩展名?

时间:2012-04-09 15:21:58

标签: ruby open-uri

这个神奇的Ruby脚本从网站下载了几个XML文件,但这些文件没有扩展名。我想为它下载的每个文件添加前缀.xml

这就是我现在所处的位置,它不起作用:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

URL = 'localhost'
extension = '.xml'

Nokogiri::HTML(open(URL)).xpath("//a/@href").each do |src|
  src = File.join(extension).last
  File.open(File.basename(src),'wb') do |f| 
    f.write(open(src).read)
  end
  puts "Done with: #{URL}"
end

有关如何使这项工作的任何想法?

2 个答案:

答案 0 :(得分:1)

我假设页面链接中的href属性包含绝对路径。考虑到这一点,这个应该工作。

require 'rubygems'
require 'nokogiri'
require 'open-uri'

base_url = 'localhost'
extension = '.xml'

Nokogiri::HTML(open(base_url)).xpath("//a/@href").each do |src|
  File.open(File.basename(src.value, File.extname(src.value)) + extension,'wb'){ |f| 
    f.write(open(src.value).read)
  }
  puts "Done with: #{URL}"
end

答案 1 :(得分:1)

使用File.join()是错误的。 .join()返回一个字符串,然后将.last应用于它会生成错误,因为String对象没有.last方法。

pry(main)> extension = '.xml'
=> ".xml"
pry(main)> File.join(extension).last
NoMethodError: undefined method `last' for ".xml":String

相反,您需要将要加入的路径元素数组传递到文件的路径中:

pry(main)> File.join('.', 'path', 'to', 'a', 'file.ext')
=> "./path/to/a/file.ext"

或:

pry(main)> File.join('/', 'path', 'to', 'a', 'file.ext')
=> "/path/to/a/file.ext"

花点时间阅读Ruby的File课程。它允许您以与操作系统无关的方式处理文件和路径。

在剖析路径时,dirnamebasenameextname方法很方便:

pry(main)> File.dirname('/path/to/a/file.ext')
=> "/path/to/a"
pry(main)> File.basename('/path/to/a/file.ext')
=> "file.ext"
pry(main)> File.extname('/path/to/a/file.ext')
=> ".ext" 

还有split方法,它结合了dirnamebasename,同时返回路径和“filename.ext”,允许您使用并行分配:

pry(main)> dirname, filename = File.split('/path/to/a/file.ext')
=> ["/path/to/a", "file.ext"]

File.basename采用可选的“扩展”参数,允许它剥离扩展程序:

pry(main)> File.basename('/path/to/a/file.ext', '.ext')
=> "file"

结合所有神奇的善良,你可以整天折叠,瞄准和毁坏你的文件名和路径。