前提・実現したいこと
この記事を真似する形で、スクレイピングのコードを作成しています。
しかしながら、一部の出力(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
回答1件
あなたの回答
tips
プレビュー