今週も特にありません

進捗どうですか?

rvestでスクレイプした時の文字化けへの対処

「rvestで日本語のページをスクレイプしたら文字化けして、上手くいかなかったけど、これで対処できたよ」的な記事を見かけたのでメモ

日銀のページはcharset=Shift_JISなので仕方がないが、charset=utf-8のページでも文字化けするケースがあったので、これを試した

対象はBloombergの国債金利ページ。普通にスクレイプして、2つ目のテーブルだけ取り出すと文字化け

> library(rvest)
> url <- "http://www.bloomberg.co.jp/markets/rates.html"
> HTML <- html(url)
> HTML %>% html_table() %>% .[[2]]
   a<U+009C><U+009F>e<U+0096><U+0093> a<U+0082> ̄a<U+0083><U+00BC>a<U+0083><U+009D>a<U+0083>3 a<U+0084><U+009F>e<U+0082><U+0084>a<U+0097>\\
1                               1a1´                                                     0.1                                    01/15/2016
2                               2a1´                                                     0.1                                    01/15/2017
3                               3a1´                                                     1.5                                    12/20/2017
4                               4a1´                                                     1.3                                    12/20/2018
5                               5a1´                                                     0.1                                    12/20/2019
6                               6a1´                                                     1.2                                    12/20/2020
7                               7a1´                                                     0.9                                    03/20/2022
8                               8a1´                                                     0.7                                    12/20/2022
9                               9a1´                                                     0.6                                    12/20/2023
10                             10a1´                                                     0.3                                    12/20/2024
11                             15a1´                                                     2.1                                    12/20/2029
12                             20a1´                                                     1.2                                    12/20/2034
13                             30a1´                                                     1.5                                    12/20/2044
   a<U+00BE>!a<U+00A0><U+00BC> a<U+0088>ca<U+009B><U+009E>a<U+0082><U+008A> a<U+00BE>!a<U+00A0><U+00BC>a<U+00A4><U+0089>a<U+008C><U+0096>c<U+008E><U+0087>
1                       100.12                                        -0.02                                                                         -0.006
2                       100.28                                        -0.04                                                                          0.006
3                       104.44                                        -0.03                                                                         -0.020
4                       105.09                                         0.00                                                                         -0.078
5                       100.40                                         0.02                                                                         -0.074
6                       106.95                                         0.02                                                                         -0.082
7                       105.75                                         0.09                                                                         -0.278
8                       104.42                                         0.13                                                                         -0.284
9                       103.61                                         0.19                                                                         -0.302
10                      100.54                                         0.24                                                                         -0.276
11                      121.89                                         0.52                                                                         -0.386
12                      105.09                                         0.90                                                                         -0.138
13                      108.98                                         1.10                                                                         -0.428
   a<U+0088>ca<U+009B><U+009E>a<U+0082><U+008A>a<U+00A4><U+0089>a<U+008C><U+0096>c<U+008E><U+0087> a<U+009B>´a<U+0096>°a<U+0099><U+0082>e<U+0096><U+0093>
1                                                                                            0.004                                                    00:00
2                                                                                           -0.004                                                    00:00
3                                                                                            0.001                                                    00:00
4                                                                                            0.016                                                    00:00
5                                                                                            0.015                                                    00:00
6                                                                                            0.011                                                    00:00
7                                                                                            0.036                                                    00:00
8                                                                                            0.033                                                    00:00
9                                                                                            0.033                                                    00:00
10                                                                                           0.028                                                    00:00
11                                                                                           0.022                                                    00:00
12                                                                                           0.008                                                    00:00
13                                                                                           0.017                                                    00:00

readLinesを使って、ページを読めば解消できた(ただし、警告は出た…)

> HTML <- html(readLines(url, encoding = "UTF-8"))
 警告メッセージ: 
1: In if (grepl("^http", x)) { :
   条件が長さが 2 以上なので、最初の 1 つだけが使われます 
2: In if (grepl("<|>", x)) { :
   条件が長さが 2 以上なので、最初の 1 つだけが使われます 
> HTML %>% html_table() %>% .[[2]]
   期間 クーポン     償還日   価格 利回り 価格変化率 利回り変化率 更新時間
1   10.1 01/15/2016 100.12  -0.02     -0.006        0.005    21:00
2   20.1 01/15/2017 100.28  -0.04      0.006       -0.004    21:00
3   31.5 12/20/2017 104.44  -0.03     -0.020        0.001    21:00
4   41.3 12/20/2018 105.09   0.00     -0.078        0.016    21:00
5   50.1 12/20/2019 100.40   0.02     -0.074        0.015    21:00
6   61.2 12/20/2020 106.95   0.02     -0.082        0.011    21:00
7   70.9 03/20/2022 105.75   0.09     -0.278        0.036    21:00
8   80.7 12/20/2022 104.42   0.13     -0.284        0.033    21:00
9   90.6 12/20/2023 103.61   0.19     -0.302        0.033    21:00
10 100.3 12/20/2024 100.54   0.24     -0.276        0.028    21:00
11 152.1 12/20/2029 121.89   0.52     -0.386        0.022    21:00
12 201.2 12/20/2034 105.09   0.90     -0.138        0.008    21:00
13 301.5 12/20/2044 108.98   1.10     -0.428        0.017    21:00

html関数の中にもencodingのオプションがあるが、何か上手くいかなかった。説明に書かれているようにstringiパッケージを使うべきなのかもしれない。最適な方法かどうかはわからないけれども、こちらは大変簡単なのでメモしておく