質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

3547閲覧

rubyでcsvデータに出力したものが文字化けする

wistan3380

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2018/04/17 14:21

打ち消し線### 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
下記のコードでcsvでデータを取得した際にお店の名前と住所が文字化けしてしまいます。
初心者で質問の仕方がわかっておらず大変恐縮ですが教えていただけるととても助かります。

発生している問題・エラーメッセージ

エラーメッセージ

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

ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16]

Nokogiri (1.8.2)

def set_html(url)
#取得するhtml用charset
charset = nil
html = open(url) do |page|
#charsetを自動で読み込み、取得
charset = page.charset
#中身を読む
page.read
end
# Nokogiri で切り分け
return Nokogiri::HTML.parse(html,nil,charset)
end

def save_csv(shop_inf_list)
test = CSV.open('./test.csv','a')
test.puts shop_inf_list
test.close
end

def find_shop_inf(shop_name,url)
contents = set_html(url)
# ここら辺で必要な情報をhtmlから取り出す
address = contents.xpath('//p[@class="rstinfo-table__address"]').inner_text
# p address
phone = contents.xpath('//*[@id="column-side"]/div[1]/div/div/div/div/div[1]/div[1]/p').inner_text.gsub(/(\n| )/,"")
# p phone
shop_inf_list = [shop_name,url,address,phone]
save_csv(shop_inf_list)
end

################################################################################################

同時にたくさんのベージをやりすぎない、dos攻撃になるかも

東京、ランキング表示で検索したurl

urls = ['https://tabelog.com/tokyo/rstLst/1/?Srt=D&SrtT=rt&sort_mode=1','https://tabelog.com/tokyo/rstLst/2/?Srt=D&SrtT=rt&sort_mode=1']

urls.each do |url|
contents = set_html(url)
count = 0
contents.xpath('//a[@class="list-rst__rst-name-target cpy-rst-name js-ranking-num"]').each do |node|
p node.inner_text
p node.attribute('href').value
find_shop_inf(node.inner_text,node.attribute('href').value)
end
end

該当のソースコード

ソースコード

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2018/04/17 21:55

書き込んだCSVファイルの中身が文字化けと言うことですか?CSVファイルは何で開きました?
wistan3380

2018/04/18 00:31

拙い質問にもかかわらず返信いただきありがとうございます。エクセルで開くと文字化けし、サブライムテキストで開くと文字化けせずに開けます。業務で使うためエクセルで表示したいです。
guest

回答2

0

ベストアンサー

ruby

1def save_csv(shop_inf_list) 2 test = CSV.open('./test.csv','a') 3 test.puts shop_inf_list 4 test.close 5end

ruby

1def save_csv(shop_inf_list) 2 csvname = './test.csv' 3 File.write(csvname, "\uFEFF", encoding: 'utf-8') unless File.exist? csvname 4 CSV.open(csvname, 'a:utf-8'){|csv| csv << shop_inf_list} 5end

に変えて、今までのtest.csvは破棄orBOM付きUTF-8に変更でいけるかな

投稿2018/04/18 08:04

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wistan3380

2018/08/21 13:13

回答ありがとうございます!!! どのサイトで質問したかわからなくなり、ご返信が大変遅くなり申し訳ございません。 文字化けしていたので、ずっと手打ちで作成していたのですが本日こちらコピペしただけでできるようになりました! 本当にありがとうございます。 助かりました。
guest

0

テキストとして開くと文字化けしないけれど、Excelで開くと文字化けするということから、文字コードの問題のようです。
Excel(Windowsと想定)は、文字コードを認識せずにShift_JISで開きますので、Rubyが出力したcsvファイルの文字コードがShift_JIS以外であれば、Excelでは文字化けしてしまいます。

業務で使うため、Excelでの表示が必要ということで、方法は2つあります。

  1. Excel側で文字コードを指定して読み込んであげる。

Excelを開き、データ -> 外部データの取り込み -> テキストファイル -> csvファイルを指定 -> 本ファイルの文字コード指定 -> 区切り文字を「カンマ」に指定 -> 完了

  1. Rubyで文字コードを指定して出力してあげる。

標準ライブラリの「kconv」を利用して、文字コードを変換してあげる。(「require 'kconv'」を追記)
shop_inf_listに代入する配列のvalueに「.tosjis」をつけてあげる。

試してみてください。

投稿2018/04/18 05:09

easymachine

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/04/18 05:37

> shop_inf_listに代入する配列のvalueに「.tosjis」をつけてあげる。 kconvなんて古いのを勧めるのはどうなの? それに、ファイルに書き込んだ時点でexternal_encodingになるし意味ない やるならCSV.open('./test.csv','a', encoding: 'cp932')
easymachine

2018/04/20 08:20

返答が遅くなってすみません。 そうなんですね、勉強になります。
wistan3380

2018/08/21 13:13

コメントありがとうございます! 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問