这个神奇的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
有关如何使这项工作的任何想法?
答案 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
课程。它允许您以与操作系统无关的方式处理文件和路径。
在剖析路径时,dirname
,basename
和extname
方法很方便:
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
方法,它结合了dirname
和basename
,同时返回路径和“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"
结合所有神奇的善良,你可以整天折叠,瞄准和毁坏你的文件名和路径。