0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby : open-uriのcharsetメソッドが参照する文字コード

Posted at

はじめに

Rubyのopen-uriライブラリを使ってページのスクレイピングをする際、openメソッドで対象urlを開いてからcharsetメソッドを使ってページの文字コードを取得していましたが、charsetメソッドが具体的にどこから文字コードを参照しているのかがわかっていなかったため、まとめます。

charsetメソッドが参照するリソース

以下公式リファレンスです。

対象となるリソースの文字コードを文字列で返します。Content-Type ヘッダの文字コード情報が使われます。
Rubyリファレンスマニュアル OpenURI::Meta#charset

openメソッドでurlを開いた際の「対象となるリソース」というのは、「ブラウザのデベロッパーツールNetworkパネルで一覧表示されるリソース」を指します。

例としてyahooトップページでデベロッパーツールを開いて確認してみます。
https://www.yahoo.co.jp/
Screenshot from 2020-05-18 18-23-57.png

Networkタブで「www.yahoo.co.jp」のリソースを選択し、「Headers」タブで表示した画像です。

「Response Headers」の「content-type」項目に「charset=UTF-8」と記述されています。
charsetメソッドはこの「charset=UTF-8」を参照して文字コードを取得しているということです。

実際にcharsetメソッドを使ってyahooの文字コードを取得してみます。

sample1.rb
require 'open-uri'

url = 'https://www.yahoo.co.jp/'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

p charset
sample1.rbの実行結果
$ ruby sample1.rb
"utf-8"

charsetメソッドでいつも文字コードを取得できるとは限らない

上の例で見たように、charsetメソッドが参照するのはリソースの「content-type」項目です。
つまりリソースの「content-type」項目に「charset」が書かれていないと参照できません。

例えば、zozotownトップページには「content-type」項目に「charset」が記述されていません。
https://zozo.jp/
Screenshot from 2020-05-18 18-49-37.png

「content-type」項目に「charset」の記述が見当たりません。

zozotownトップページを指定して文字コードを取得してみます。

sample2.rb
require 'open-uri'

url = 'https://zozo.jp/'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

p charset
sample2.rbの実行結果
$ ruby sample2.rb
nil

結果のように、「content-type」に記述がないと、charsetメソッドで取得した結果はnilとなります。

では実際zozotownはどの文字コードで書かれているのでしょうか。
ページで「ctrl + u」を押してページのソースを表示すると、
Screenshot from 2020-05-18 19-00-11.png

zozotownのページは「Shift_JIS」で書かれていました。

このようにページによってcharsetメソッドが文字コードを取得できない場合があるので注意が必要です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?