2012-04-09 112 views
0

这个神奇的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

我假设你的意思是*扩展*,而不是*前缀*,并且我更新了你的问题以反映这一点。 – 2012-04-09 15:25:46

+0

@AndrewMarshall,是的谢谢队友。前缀是添加到开头的单词部分。 – SHUMAcupcake 2012-04-09 15:30:10

回答

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 
+0

我建议编码更防守一点:'file_name = File.basename(src.value,File.extname(src.value))+ extension'将防止文件扩展名,不管它是什么,而仍然添加所需的“.xml”。没有这些,你可能会得到两倍的文件扩展名,比如''.xml.xml''。 – 2012-04-09 16:04:41

+0

同意,而且,我意识到,考虑到问题中提出的问题,该脚本将无法工作。我会在短时间内回来编辑。 – 2012-04-09 16:10:15

+0

完成。这应该使用其原始文件名下载该文件,并以'.XML'扩展名保存。 – 2012-04-09 16:13:43

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需要一个可选的“扩展”参数,允许它剥离extensi上:

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

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

+0

+1为教我们两件事:) – 2012-04-10 07:22:30

相关问题