【问题标题】:RUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdirRUBY (Errno::ENOENT),没有这样的文件或目录@ dir_s_mkdir
【发布时间】:2015-09-20 03:37:57
【问题描述】:

我正在关注“The Bastards Book of Ruby”,我正在尝试使用 nokogiri 构建一个 webscraper,但是当我尝试运行代码时大约四分之一的时间会引发错误:

Crawler.rb:6:in `mkdir': No such file or directory @ dir_s_mkdir - data-hold/nobel (Errno::ENOENT)
from Crawler.rb:6:in `<main>'

我的代码如下:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

DATA_DIR = "data-hold/nobel"
Dir.mkdir(DATA_DIR) unless File.exists?(DATA_DIR)

BASE_WIKIPEDIA_URL = "http://en.wikipedia.org"
LIST_URL = "#{BASE_WIKIPEDIA_URL}/wiki/List_of_Nobel_laureates"

HEADERS_HASH = {"User-Agent" => "Ruby/#{RUBY_VERSION}"}

page = Nokogiri::HTML(open(LIST_URL))
rows = page.css('div.mw-content-ltr table.wikitable tr')

rows[1..-2].each do |row|

  hrefs = row.css("td a").map{ |a| 
    a['href'] if a['href'] =~ /^\/wiki\// 
  }.compact.uniq

  hrefs.each do |href|
    remote_url = BASE_WIKIPEDIA_URL + href
    local_fname = "#{DATA_DIR}/#{File.basename(href)}.html"
    unless File.exists?(local_fname)
      puts "Fetching #{remote_url}..."
      begin
        wiki_content = open(remote_url, HEADERS_HASH).read
      rescue Exception=>e
        puts "Error: #{e}"
        sleep 5
      else
        File.open(local_fname, 'w'){|file| file.write(wiki_content)}
        puts "\t...Success, saved to #{local_fname}"
      ensure
        sleep 1.0 + rand
      end  # done: begin/rescue
    end # done: unless File.exists?

  end # done: hrefs.each
end # done: rows.each

我真的不知道为什么它不创建一个新目录来存储数据。我知道我一定错过了一些非常简单的东西......

【问题讨论】:

    标签: ruby web-crawler mkdir


    【解决方案1】:

    我最好的猜测是,不仅“data-hold/nobel”不存在,“data-hold/”也不存在。由于mkdir不会递归创建你要创建的目录的所有父目录,所以会抛出错误。

    要解决此问题,您可以使用FileUtils.mkdir_p,它会创建所有父目录。

    在使用mkdir_p之前一定要include fileutils

    【讨论】:

      【解决方案2】:

      将需求捆绑到带有适当调试消息的方法中。按预期工作。

      $:~/rubyterminals/file_tansfer$ cat mkdir_mthod.rb 
      #!/usr/bin/env ruby
      require 'fileutils'
      
      def run
      
      my_dir="/home/rubyterminals/file_tansfer/new_dir"
      create_a_directory(my_dir)
      
      end
      
      
      def create_a_directory(dir_name)
      
          if dir_name
            # dir_name was specified, ensure it is created and writable.
            unless File.exist?(dir_name)
              begin
                FileUtils.mkdir_p(dir_name)
                 puts "just made the following dir #{dir_name}"
              rescue Errno::EACCES => e
                abort "Failed to create #{dir_name}: #{e.message}"
              end
            end
      end
      end
      
      run
      

      测试过:

      -SVE1411EGXB:~/rubyterminals/file_tansfer$ ./mkdir_mthod.rb 
      
      just made the following dir /home/rubyterminals/file_tansfer/new_dir
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2020-02-22
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 2013-02-01
        相关资源
        最近更新 更多