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!