Прежде всего - названия продуктов. Вы извлекаете слишком много информации из HTML. Элемент h2 содержит пробелы и элемент span внутри, которые, вероятно, следует игнорировать. Вы можете сделать это так:
product_names.each do |product_name|
name << product_name.css('h2.product-name a').children[0].text.gsub(/\s{2,}/, '')
end
Затем CSV требует передачи каждой строки в виде массива с несколькими элементами. В вашем случае должно быть много массивов с двумя элементами (название продукта и цена). Для этого вы можете просто сжать две таблицы:
items = name.zip(price)
А затем создайте файл CSV:
CSV.open('data/wheyprotein.csv', 'w') do |csv|
csv << headers
items.each {|row| csv << row }
end
Полный метод выглядит следующим образом:
def whey_scrapper
company = 'Body+%26+fit'
url = "https://www.bodyenfitshop.nl/eiwittenwhey/whey-proteine/?limit=81&manufacturer=#{company}"
unparsed_page = open(url).read
parsed_page = Nokogiri::HTML(unparsed_page)
product_names = parsed_page.css('div.product-primary')
name = Array.new
product_names.each do |product_name|
name << product_name.css('h2.product-name a').children[0].text.gsub(/\s{2,}/, '')
end
product_prices = parsed_page.css('div.price-box')
price = Array.new
product_prices.each do |product_price|
price << product_price.css('span.price').text
end
headers = ["name", "price"]
items = name.zip(price)
CSV.open('data/wheyprotein.csv', 'w+') do |csv|
csv << headers
items.each {|row| csv << row }
end
end