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

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

4

2 回答 2

1

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

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课程。它允许您以完全独立于操作系统的方式处理文件和路径。

在剖析路径时,它dirnamebasename、 和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一种结合dirnameand的方法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"

结合所有这些神奇的优点,您可以整天折叠、旋转和破坏您的文件名和路径。

于 2012-04-09T16:26:13.493 回答
0

我假设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
于 2012-04-09T15:40:05.003 回答