gpt4 book ai didi

ruby - 将图像文件从阵列写入磁盘 : No such file or directory - when using 'w' 的问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:20 25 4
gpt4 key购买 nike

下面的程序几乎完成了我想要它做的所有事情,但它不会将图像文件写入被抓取的光盘。最新的错误没有这样的文件或目录用于我想要获取的图像文件之一的基本名称。它应该在写新文件,但我想我做错了什么。错误:没有这样的文件或目录 - h3130gy1-3-7ec5.jpg 。理想情况下,该程序会将每个图像写入光盘,每个图像的名称是用于获取它的绝对 url 的基本名称。我还希望电子表格元素将每个抓取图像的基本名称写入正在编译的输出文件。

require "capybara/dsl"
require "spreadsheet"
require "fileutils"
require "open-uri"

LOCAL_DIR = 'data-hold/images'

FileUtils.makedirs(LOCAL_DIR) unless File.exists?LOCAL_DIR
Capybara.run_server = false
Capybara.default_driver = :selenium
Capybara.default_selector = :xpath
Spreadsheet.client_encoding = 'UTF-8'

class Tomtop
include Capybara::DSL

def initialize
@excel = Spreadsheet::Workbook.new
@work_list = @excel.create_worksheet
@row = 0
end

def go
visit_main_link
end

def visit_main_link
visit "http://www.example.com/clothing-accessories?dir=asc&limit=72&order=position"
results = all("//h5/a[contains(@onclick, 'analyticsLog')]")
item = []

results.each do |a|
item << a[:href]
end
item.each do |link|
visit link
save_item
end
@excel.write "inventory.csv"

end

def save_item

data = all("//*[@id='content-wrapper']/div[2]/div/div")
data.each do |info|
@work_list[@row, 0] = info.find("//*[@id='productright']/div/div[1]/h1").text
price = info.first("//div[contains(@class, 'price font left')]")
@work_list[@row, 1] = (price.text.to_f * 1.33).round(2) if price
@work_list[@row, 2] = info.find("//*[@id='productright']/div/div[11]").text
@work_list[@row, 3] = info.find("//*[@id='tabcontent1']/div/div").text.strip
color = info.all("//dd[1]//select[contains(@name, 'options')]//*[@price='0']")
@work_list[@row, 4] = color.collect(&:text).join(', ')
size = info.all("//dd[2]//select[contains(@name, 'options')]//*[@price='0']")
@work_list[@row, 5] = size.collect(&:text).join(', ')
imagelink = info.all("//*[@rel='lightbox[rotation]']")
@work_list[@row, 6] = imagelink.map { |link| link['href'] }.join(', ')
image = imagelink.map { |link| link['href'] }
File.open (File.basename("#{LOCAL_DIR}/#{image}", 'w')) do |f|
f.write(open(image).read)
end
@row = @row + 1
end

end

end


tomtop = Tomtop.new
tomtop.go

最佳答案

看起来好像你有一个括号放错了地方,这一行:

File.open (File.basename("#{LOCAL_DIR}/#{image}", 'w')) do |f|

应该是这样的:

File.open(File.basename("#{LOCAL_DIR}/#{image}"), 'w') do |f|

但实际上,在进一步调查您的代码时,似乎 File.basename 在这种情况下作用于不正确的字符串。运行代码后,它会用图像填充 scraper.rb 的根文件夹。所以,我认为你真正想要的是:

#only grab the basename of the image, then concatenate that to the end of the local_dir:
filename = "#{LOCAL_DIR}/#{File.basename(image)}"
File.open(filename, 'w') do |f|

运行完之后,我遇到了下一个问题。看起来“图像”是一个包含许多网址的数组。

根据您要实现的目标,您可能需要进行一些额外的过滤以将图像缩小为单个图像,或者将其更改为“图像”并使用以下代码:

images = imagelink.map { |link| link['href'] }
images.each do |image|
File.open(File.basename("#{LOCAL_DIR}/#{image}"), 'w') do |f|
f.write(open(image).read)
end
end
@row = @row + 1

关于ruby - 将图像文件从阵列写入磁盘 : No such file or directory - when using 'w' 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com