2017-10-01 3 views
2

私はRuby初心者です。今日は初めてのスクラップを試しました。これは、レシピをCSVファイルに保存するように設計されたスクレイパーです。それにもかかわらず、私はそれが動作しない理由を把握することはできません。ここに私のコードは次のとおりです。RubyでCSVを掻き集めて保存する

recipe.rb:

require 'csv' 
require 'nokogiri' 
require 'open-uri' 


def write_csv(ingredient) 

doc = Nokogiri::HTML(open("http://www.marmiton.org/recettes/recherche.aspx?aqt=#{ingredient}"), nil, 'utf-8') 
    doc.search(".m_contenu_resultat").first(10).each do |item| 
    name = item.search('.m_titre_resultat a').text 
    description = item.search('.m_texte_resultat').text 
    cooking_time = item.search('.m_detail_time').text 
    diff = item.search('.m_detail_recette').text.split('-') 
    difficulty = diff[2] 
    recipes = [name, description, cooking_time, difficulty] 
    CSV.open('recueil.csv', 'wb') do |csv| 
     csv << recipes 
    end 
    end 
end 

write_csv('chocolat') 

それは私をたくさん助けてよ、あなたの答えのためにどうもありがとうございます!

+0

私はあなたが_scraper_ではなく_scrapper_を意味すると思います。 – Beejamin

答えて

0

CSVファイルを開くときは、毎回前のファイルを上書きしています。あなたはeighterこのようなファイルに追加する必要があります

CSV.open('recueil.csv', 'a') do |csv| 

か、このようにループを開始する前に、あなたはそれを開くことができます:

def write_csv(ingredient) 
    doc = Nokogiri::HTML(open("http://www.marmiton.org/recettes/recherche.aspx?aqt=#{ingredient}"), nil, 'utf-8') 
    csv = CSV.open('recueil.csv', 'wb') 
    doc.search(".m_contenu_resultat").first(10).each do |item| 
    name = item.search('.m_titre_resultat a').text 
    description = item.search('.m_texte_resultat').text 
    cooking_time = item.search('.m_detail_time').text 
    diff = item.search('.m_detail_recette').text.split('-') 
    difficulty = diff[2] 
    recipes = [name, description, cooking_time, difficulty] 
    csv << recipes 
    end 
    csv.close 
end 
0

あなたは動作しないものを指定していない、どのような結果エラーのうち、私は推測する必要があります。

サイトがフランス語で、特殊文字がたくさんあるので、スクリプトを試してエンコードに問題がありました。

スクリプトの先頭でこれをもう一度試してください。少なくとも、この問題は解決するはずです。

# encoding: utf-8 
Encoding.default_external = Encoding::UTF_8 
Encoding.default_internal = Encoding::UTF_8 
+0

ありがとうございます!私はそれを追加しましたが、要素はまだCSVに残っていません。コンソールにエラーメッセージが表示されません:/ – Marianne

+0

レシピの配列に何かが含まれているかどうかを確認しましたか? 'c:/temp/recueil.csv'のように 'recueil.csv'の代わりにフルパスを使用すると、おそらくcsvが生成されますが、期待するフォルダにはありません – peter

0

IT WORKED!私は以下のように、ハッシュを使ってコードを変更しました:

require 'csv' 
require 'nokogiri' 
require 'open-uri' 


def write_csv(ingredient) 
recipes= [] 
doc = Nokogiri::HTML(open("http://www.marmiton.org/recettes/recherche.aspx?aqt=#{ingredient}"), nil, 'utf-8') 
    doc.search(".m_contenu_resultat").first(10).each do |item| 
    name = item.search('.m_titre_resultat a').text 
    description = item.search('.m_texte_resultat').text 
    cooking_time = item.search('.m_detail_time').text 
    diff = item.search('.m_detail_recette').text.split('-') 
    difficulty = diff[2] 
    recipes << { 
    name: name, 
    description: description, 
    difficulty: difficulty 
    } 
end 

    CSV.open('recueil.csv','a') do |csv| 
    csv << ["name", "description", "cooking_time", "difficulty"] 
    recipes.each do |recipe| 
    csv << [ 
     recipe[:name], 
     recipe[:description], 
     recipe[:cooking_time], 
     recipe[:difficulty] 
    ] 
    end 
end 
end 

write_csv('chocolat') 
関連する問題