`initialize': 使用 Nokogiri 打开网站时没有这样的文件或目录@ rb_sysopen
`initialize': No such file or directory @ rb_sysopen when using Nokogiri to open site
我创建了一个使用 Scraper class 来抓取网站的 CLI 程序。我正在使用 Nokogiri 和 Open-URI。顶部的错误正在弹出。我在网上看了看,没有找到帮助。
我确保网站没有拼写错误。
从 CLI class 我创建了一个新的 Scraper class 使用站点作为 arg
class KefotoScraper::CLI
attr_accessor :kefoto_scraper
def initialize
site = "https://www.kefotos.mx"
@kefoto_scraper = Scraper.new(site)
end
end
在 Scraper 中我有以下代码:
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:在“初始化”中:没有这样的文件或目录@rb_sysopen - https://www.kefotos.mx (Errno::ENOENT)
open
默认操作本地文件,而不是 URL。该错误意味着 "I can't find a file on your hard drive named https://www.kefotos.mx
".
您可以通过要求 open-uri
库让它在 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)))
我创建了一个使用 Scraper class 来抓取网站的 CLI 程序。我正在使用 Nokogiri 和 Open-URI。顶部的错误正在弹出。我在网上看了看,没有找到帮助。
我确保网站没有拼写错误。
从 CLI class 我创建了一个新的 Scraper class 使用站点作为 arg
class KefotoScraper::CLI
attr_accessor :kefoto_scraper
def initialize
site = "https://www.kefotos.mx"
@kefoto_scraper = Scraper.new(site)
end
end
在 Scraper 中我有以下代码:
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:在“初始化”中:没有这样的文件或目录@rb_sysopen - https://www.kefotos.mx (Errno::ENOENT)
open
默认操作本地文件,而不是 URL。该错误意味着 "I can't find a file on your hard drive named https://www.kefotos.mx
".
您可以通过要求 open-uri
库让它在 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)))