`initialize ': нет такого файла или каталога @ rb_sysopen при использовании Nokogiri для открытия сайта - PullRequest
0 голосов
/ 08 ноября 2019

Я создал программу CLI, которая использует класс Scraper для очистки сайта. Я использую Nokogiri и Open-URI. Ошибка сверху выскакивает. Я посмотрел онлайн и не нашел помощи.

Я убедился, что на сайте нет опечаток.

из класса CLI. Я создаю новый класс Scraper, используя сайт как arg

class KefotoScraper::CLI

    attr_accessor :kefoto_scraper

      def initialize
      site = "https://www.kefotos.mx"
      @kefoto_scraper = Scraper.new(site)
      end
end

В Scraper Iиметь следующий код:

class Scraper

  attr_accessor :doc, :product_names, :site, :name, :link


  def initialize(site)
    @site = site
    @doc = doc
    @product_names = product_names
    @name = name
    @link = link
    @price_range = [].uniq
    scrape_product
  end

  def get_html
    @doc = Nokogiri::HTML(open(@site))
    @product_names = doc.css(".navbar-nav li")
    product_names
  end

  def scrape_product
    get_html.each {|product|
      @name = product.css("span").text
      plink = product.css("a").attr("href").text
      @link = "#{site}#{link}"
      link_doc = Nokogiri::HTML(open(@link))
      pr = link_doc.scan(/[\$£](\d{1,3}(,\d{3})*(\.\d*)?)/)
      prices = pr_link.text
        prices.each {|price|
          if @price_range.include?(price[0]) == false
            @price_range << price[0]
            end
        }

      new_product = Products.new(@name, @price_range)
      puts new_product
  }
  end

end

Я получаю следующую ошибку:

scraper.rb: 18: в `initialize ': нет такого файла или каталога @ rb_sysopen - https://www.kefotos.mx (Errno :: ENOENT)

1 Ответ

0 голосов
/ 08 ноября 2019

open по умолчанию работает с локальными файлами, а не с URL. Эта ошибка означает «Я не могу найти файл на вашем жестком диске с именем https://www.kefotos.mx».

Вы можете разрешить ему работать на URI, требуя библиотеку open-uri:

require 'open-uri'

Это заставит ваш код работать, но гораздо лучше использовать подходящий HTTP-клиент для чтения HTTP-ресурсов, поскольку злоумышленник может использовать перегруженный open() для доступа к файлам на жестком диске вашей машины.

Например, если бы вы использовали только net / http:

# At the top of your scraper.rb:
require 'net/http'

# Then, in your class:
link_doc = Nokogiri::HTML(Net::HTTP.get(URI(@link)))
...