0

この魔法のRubyスクリプトは、Webサイトからいくつかの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()が間違っています。String オブジェクトのメソッドがないため、これを.join()適用するとエラーが発生します。.last.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"

File時間をかけて Ruby のクラスについて読んでください。これにより、OS にかなり依存しない方法でファイルとパスを操作できます。

その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と を組み合わせdirnameて、パスと "filename.ext" の両方を返すメソッドもあり、basename並列代入を使用できます。

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"

その魔法のような良さをすべて組み合わせると、ファイル名とパスを 1 日中折りたたんだり、紡いだり、切断したりできます。

于 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 に答える