2012-04-09 237 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