サイトのエンコーディングを調べる
Text Update: 12/04, 2018 (JST)

Webサイトに対するスクレイピングを行っていると取得したデータが文字化けを起こしている場合があります。多くはUTF-8とは異なる文字セット(エンコーディング)を使用しているサイトですので、正しくエンコーディングを指定をすれば文字化けは解消します。そこで、今回はスクレイピング時にWebサイトのエンコーディング情報を取得する方法を紹介します。

Packages and Datasets

本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
 

Package Version Description
knitr 1.20 A General-Purpose Package for Dynamic Report Generation in R
rvest 0.3.2 Easily Harvest (Scrape) Web Pages
xml2 1.2.0 Parse XML
tidyverse 1.2.1 Easily Install and Load the ‘Tidyverse’

 

関数で調べる

R でスクレイピングを行う時に必ずといっていいほど使用するrvestパッケージにはエンコーディングを推定するためのrvest::guess_encoding関数が用意されています。このrvest::guess_encoding関数がどの程度正確にエンコーディングを推定するか確認してみます。
 

UTF-8を指定している場合

気象庁のサイトはエンコーディングにUTF-8を指定しています。
 

 
このサイトのエンコーディングをrvest::guess_encoding関数で推測してみると以下の結果のように第一候補がUTF-8となりました。
 

"http://www.jma.go.jp/jma/index.html" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
UTF-8 1.00
windows-1252 en 0.28
windows-1250 ro 0.19
UTF-16BE 0.10
UTF-16LE 0.10
windows-1254 tr 0.08
windows-1253 el 0.01

 

UTF-8とは異なる場合

次に シフトJISを使い続ける上場企業をまとめてみた を参考にUTF-8とは異なるエンコーディングを利用しているサイトのエンコーディングを推定してみます。

先に結論を述べておくとrvest::guess_encoding関数の結果だけで使用されているエンコーディングを断定するのは心許ないところがあります。
 

Shift JISの場合

日清オイリオ

日清オイリオ

"http://www.nisshin-oillio.com/" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
Shift_JIS ja 0.70
GB18030 zh 0.37
Big5 zh 0.31
UTF-8 0.25
windows-1252 en 0.23
windows-1250 ro 0.16
UTF-16BE 0.10
UTF-16LE 0.10
windows-1254 tr 0.08

 

いすゞ自動車

いすゞ自動車

"http://www.isuzu.co.jp/" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
UTF-8 1.00
Shift_JIS ja 0.59
GB18030 zh 0.38
Big5 zh 0.26
windows-1252 en 0.23
windows-1250 ro 0.16
UTF-16BE 0.10
UTF-16LE 0.10
windows-1254 tr 0.06

 

価格コム

価格コム

"http://kakaku.com/" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
UTF-8 1.00
Shift_JIS ja 0.73
GB18030 zh 0.56
Big5 zh 0.39
windows-1252 fr 0.23
windows-1250 ro 0.15
UTF-16BE 0.10
UTF-16LE 0.10
windows-1254 tr 0.05

 

やまや

やまや

"https://www.yamaya.jp/" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
UTF-8 1.00
Shift_JIS ja 0.71
windows-1252 en 0.28
windows-1250 ro 0.17
windows-1254 tr 0.12
UTF-16BE 0.10
UTF-16LE 0.10

 

EUC-JPの場合

楽天

楽天

"https://www.rakuten.co.jp/" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
UTF-8 1.00
Shift_JIS ja 0.72
GB18030 zh 0.52
Big5 zh 0.50
windows-1252 en 0.21
windows-1250 ro 0.11
UTF-16BE 0.10
UTF-16LE 0.10
windows-1254 tr 0.07

 

長府製作所

長府製作所

"https://www.chofu.co.jp/" %>% 
  xml2::read_html() %>% rvest::guess_encoding() %>% knitr::kable()
encoding language confidence
UTF-8 1.00
Shift_JIS ja 0.56
windows-1252 en 0.25
windows-1250 ro 0.15
UTF-16BE 0.10
UTF-16LE 0.10
windows-1254 tr 0.08
KOI8-R ru 0.01

 

メタ情報で調べる

Webサイトのエンコーディングを確実に知るためには、やはり、Webサイトのエンコーディング指定(通常はヘッダ内のメタ情報で指定する)を直接調べるのが確実です。
エンコーディングはメタ情報のcontent属性で指定されますので、rvest::html_attr関数を利用すると取得することができます。
 

長府製作所を例にCSSセレクタを指定してcontent属性を取得すると
 

長府製作所

長府製作所

 

"https://www.chofu.co.jp/" %>% 
  xml2::read_html() %>% rvest::html_node("head > meta:nth-child(1)") %>% 
  rvest::html_attr("content")
## [1] "text/html; charset=euc-jp"

このようにエンコーディングの指定が取得できます。後は、charset=の後ろにある指定部分をstringrパッケージなどを用いて切り出せばエンコーディングの取得は完了です。
 

"https://www.chofu.co.jp/" %>% 
  xml2::read_html() %>% rvest::html_node("head > meta:nth-child(1)") %>% 
  rvest::html_attr("content") %>% 
  stringr::str_sub(stringr::str_locate(., pattern = "charset=")[2] + 1,
                   stringr::str_length(.))
## [1] "euc-jp"

 
Enjoy!  

本blogに対するアドバイス、ご指摘等は データ分析勉強会 または GitHub まで。

CC BY-NC-SA 4.0 , Sampo Suzuki