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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Q&A

解決済

1回答

1688閲覧

出力にunicodeが混入してしまう

k_z.soon

総合スコア0

Ruby

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

0グッド

0クリップ

投稿2021/11/22 00:26

前提・実現したいこと

この記事を真似する形で、スクレイピングのコードを作成しています。
しかしながら、一部の出力(tagsの日本語部分)がunicodeエスケープシーケンスとなっており、原因がわかりません。
unicodeの混じった配列ではなく、日本語配列で出力しようとしています。

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

以下がソースコードです。

require 'open-uri' require 'nokogiri' require 'csv' url = 'https://qiita.com/search?page=1&q=ruby&sort=like' res = open(url) body = res.read charset = res.charset html = Nokogiri::HTML.parse(body, url = nil, encoding = charset) results = [] html.search('.searchResult_main').each do |node| title = node.css('.searchResult_itemTitle').inner_text tags = node.css('.tagList_item').map{ |article_tag| article_tag.inner_text } detail = node.css('.searchResult_snippet').inner_text results << { title: title, tags: tags, details: detail } end results.each.with_index(1) do |n, i| puts "#{i}番目の情報" puts "タイトル: #{n[:title]}" puts "タグ: #{n[:tags]}" end

出力が以下のようになっています。vscodeのcode runnerにて実行しています。

1番目の情報 タイトル: Markdown記法 チートシート タグ: ["Qiita", "Markdown"] 2番目の情報 タイトル: プログラミングでよく使う英単語のまとめ【随時更新】 タグ: ["\u30D7\u30ED\u30B0\u30E9\u30DF\u30F3\u30B0", "\u82F1\u8A9E", "\u547D\u540D\u898F\u5247", "English"] . . .

2番目の部分が、タグ: ["プログラミング", "英語", "命名規則", "English"]のように出力されません。

試したこと

1. 文字列に変換する際に、日本語出力が失敗する?
puts results[1][:tags]で、中身を見ると、日本語で出力されました。

プログラミング 英語 命名規則 English

しかし、ソースコードのようにputs "#{results[1][:tags]}"では上記と同じくunicodeが混じった配列が出力されました。
加えて、puts results[1][:tags].to_sにおいても同様でした。

arrayからstringと変換される際に、何かしらの問題が発生していると考えていますが、解決策が出ていません。

2. packメソッドの使用
この記事に、変換を試みましたが、unicodeでない要素があるために失敗しました。

3. charset
そもそもの文字コード取得が間違っているのではないかと考え、
charsetを確認するも、utf-8であり正常でした。

4. p, puts, print
出力するメソッドの違いを調べていますが、当問題に関わる部分が見当たりません。
あるいは、まだ見つけられていません。

プログラミングの理解が浅く、的外れなことをしているかもしれませんが、
回答いただけると幸いです。

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

ruby 2.5.1
mac bigsur

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

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

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

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

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

otn

2021/11/22 14:46

古いRubyですね。 ・ソースコードのエンコーディングはUTF-8ですか? ・環境変数RUBYOPTが設定されていますか?その場合は値は何ですか? ・コマンドプロンプトで実行したらちゃんと表示されますか?
k_z.soon

2021/11/22 17:49 編集

回答ありがとうございます。 rubyoptについて調べ、「実行環境の文字コードが `utf-8` になっていないのではないか」と思いました。 そこで、コマンドプロンプトにて、実行の際に文字コードを`Ku`で指定してみたところ、出力が整いました。 しかしながら、ご指摘いただいたように、コマンドで実行するだけで解決しました。 `code runner`では出力が乱れることが報告されていたようです。 https://gyazo.com/6e6f77e685f75bb91fc3d8518a53655c 実行の際に問題が生じていたとは、想像していませんでした。 ありがとうございます! [参考](https://spirits.appirits.com/doruby/9884/) [参考](https://www.xmisao.com/2014/03/18/set-script-encoding-by-bashrc.html) [参考](https://docs.ruby-lang.org/ja/latest/doc/spec=2fenvvars.html) [参考](https://github.com/formulahendry/vscode-code-runner/issues/25) [参考](https://ymdevx3.hatenablog.com/entry/2019/08/26/012020)
otn

2021/11/23 10:06

-Ku というのは、Ruby1.8まで使われていたオプションです。 1.9以降では、ソース中のencodingマジックコメントと、-E オプションを使います。 今のところ、1.9以降でもそれなりにうまく行くように解釈してくれているようですがそのうちエラーになるはず。 RUBYOPTは未設定だったと言うことでしょうか?
k_z.soon

2021/11/24 20:56

バージョンの移行に関しては、考慮していませんでした。 留意・確認するようにします。 rubyoptを確認する方法がわからなかったため、参考記事より、 「外部エンコーディング」と「内部エンコーデング」を調べました。 外部エンコーディングは「#<Encoding:UTF-8>」 内部エンコーディングは「nil」であり、デフォルトでした。 [参考](https://docs.ruby-lang.org/ja/latest/doc/spec=2fenvvars.html) [参考](https://hail2u.net/blog/webdesign/setting-rubyopt-for-sass.html)
otn

2021/11/24 23:26

> rubyoptを確認する方法がわからなかったため 環境変数という概念を知らなかったのなら、この機会に学んでみましょう。
k_z.soon

2021/11/25 05:03

はじめての概念ですので、時間をとって調べ、考えようと思います。
guest

回答1

0

自己解決

1. rubyインタプリタに渡す文字コードを指定する
参考

2. もしくはcode runnerを使用している場合は、コマンドプロンプトで実行する
あるいは、code runnerの実行環境を整える。

投稿2021/11/22 17:44

編集2021/11/22 17:50
k_z.soon

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問