У меня есть программа, использующая драгоценный камень электронной таблицы для создания CSV-файла; Я не смог найти способ настройки необходимых мне функций.Как настроить gem/output таблицы электронной таблицы?
Это то, что я хотел бы сделать: номер модели и поле additional_image
должно быть «синхронно», то есть каждое дополнительное изображение, записанное в документ электронной таблицы, должно быть новой строкой и не должно быть обернуто.
Ниже приведены некоторые фрагменты желаемого результата в отличие от тока. Эти поля определяются объектами XPath, которые скрипируют экран с использованием другого драгоценного камня. Программа не будет знать наверняка, сколько объектов она встретит в дополнительном поле изображения, но из-за бизнес-логики число объектов в дополнительном поле изображения должно отражать количество объектов номера модели, которые записаны в электронную таблицу.
model
168868837a
168868837a
168868837a
168868837a
168868837a
168868837a
additional_image
1688688371.jpg
1688688372.jpg
1688688373.jpg
1688688374.jpg
1688688375.jpg
1688688376.jpg
Это текущий код:
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 retryable(options = {}, &block)
opts = { :tries => 1, :on => Exception }.merge(options)
retry_exception, retries = opts[:on], opts[:tries]
begin
return yield
rescue retry_exception
retry if (retries -= 1) > 0
end
yield
end
def visit_main_link
retryable(:tries => 1, :on => OpenURI::HTTPError) do
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
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(', ')
model = File.basename(info.find("//*[@id='content-wrapper']/div[2]/div/div/div[1]/div[1]/a")['href'])
@work_list[@row, 6] = model.gsub!(/\D/, "")
@work_list[@row, 7] = File.basename(info.find("//*[@id='content-wrapper']/div[2]/div/div/div[1]/div[1]/a")['href'])
additional_image = info.all("//*[@rel='lightbox[rotation]']")
@work_list[@row, 8] = additional_image.map { |link| File.basename(link['href']) }.join(', ')
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
end
end
end
tomtop = Tomtop.new
tomtop.go
Я хотел бы, чтобы это сделать две вещи, которые я не знаю, как это сделать:
- Каждое дополнительное изображение должно напечатать на новая строка (в настоящее время она печатает все в одной ячейке).
- Я хотел бы, чтобы поле модели дублировалось ровно столько раз, сколько есть
additional_images
в той же новой линии.
Вы имеете в виду использование этого в сочетании с драгоценным камнем электронной таблицы или изменение всего создания csv на драгоценный камень csv. Полагаю, я понимаю, как работает цикл while, но как бы реализовать это в текущем коде. Спасибо за ваше время. – jcuwaz
Вы можете распечатать свой массив данных? – Duck1337
Duck мы можем вернуться к этому, я все еще работаю над этой прогой, и я не уверен, что вы поняли, что я хотел сделать. Вы, безусловно, один из экспертов, когда речь идет о драгоценности CSV, и я думаю, что это сэкономит мне много времени на создание других моделей, если я смогу настроить существующий выход csv для работы с сайтом. Вот ссылка на файл csv, который выводит моя текущая программа: https://drive.google.com/file/d/0B4VR1BUz6onVRnVfSURBTDZkMDA/edit?usp=sharing; Мне нужно манипулировать им таким образом, чтобы он соответствовал требованиям к загрузке программного обеспечения для электронной коммерции. – jcuwaz