Веб-скрейпинг с Nokogiri::HTML и Ruby — проблема вывода в CSV

У меня есть скрипт, который очищает HTML-страницы статей интернет-магазина. Я тестирую набор из 22 страниц, из которых 5 страниц со статьями содержат описание продукта, а остальные — нет.

Этот код выводит правильную информацию на экран:

if doc.at_css('.product_description')
  doc.css('div > .product_description > p').each do |description|
    puts description
  end
  else
    puts "no description"
end

Но теперь я застрял на том, как правильно это сделать, чтобы выводить найденные описания продуктов в массив, откуда я пишу их в файл CSV.

Перепробовал несколько вариантов, но ни один пока не работает. Если я заменю puts description на @description << description.content, то все описания статей окажутся в верхних строках CSV, хотя они не относятся к статьям в этой строке.

Когда я также заменяю «без описания» на @description = "no description", тогда первые 14 строк в моем CSV получают по 1 букве «без описания» каждая. Выглядит забавно, но это не совсем то, что мне нужно.

Если нужно больше кода, просто кричите!

Это код CSV, который я использую в скрипте:

    CSV.open("artinfo.csv", "wb") do |row|
    row << ["category", "sub-category", "sub-sub-category", "price", "serial number",  "title", "description"]
    ([email protected] - 1).each do |index|
    row << [
            @categories[index], 
            @subcategories[index], 
            @subsubcategories[index], 
            @prices[index],
            @serial_numbers[index], 
            @title[index],
            @description[index]]
     end 
    end  

person user2215918    schedule 28.03.2013    source источник
comment
Можете ли вы также показать нам свой код CSV?   -  person gmaliar    schedule 29.03.2013
comment
Часть путаницы вызывает ваш объект CSV row   -  person pguardiario    schedule 29.03.2013
comment
Не понимаю, другие данные отображаются правильно в файле csv... только описание ведет себя странно   -  person user2215918    schedule 29.03.2013


Ответы (1)


Похоже, ваши данные не выровнены должным образом. Если бы это было так, вы могли бы сделать:

CSV.open("artinfo.csv", "w") do |csv|
  csv << ["category", "sub-category", "sub-sub-category", "price", "serial number",  "title", "description"]
  [@categories, @subcategories, @subsubcategories, @prices, @serial_numbers, @title, @description].transpose.each do |row|
    csv << row
  end 
end
person pguardiario    schedule 29.03.2013
comment
Это дает мне невозможно преобразовать строку в массив в csv ‹‹ [категория и т. д., и т. д. строка, которую я должен изучить - person user2215918; 29.03.2013
comment
Если бы я был вами, я бы нашел лучший способ повторения. Не имеет смысла помещать все цены в один массив, все названия в другой и т. д. - person pguardiario; 29.03.2013
comment
С этим последним советом и хорошим взглядом на код мне удалось решить мою проблему, спасибо! - person user2215918; 30.03.2013