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 1年 0.1 01/15/2016 100.12 -0.02 -0.006 0.005 21:00 2 2年 0.1 01/15/2017 100.28 -0.04 0.006 -0.004 21:00 3 3年 1.5 12/20/2017 104.44 -0.03 -0.020 0.001 21:00 4 4年 1.3 12/20/2018 105.09 0.00 -0.078 0.016 21:00 5 5年 0.1 12/20/2019 100.40 0.02 -0.074 0.015 21:00 6 6年 1.2 12/20/2020 106.95 0.02 -0.082 0.011 21:00 7 7年 0.9 03/20/2022 105.75 0.09 -0.278 0.036 21:00 8 8年 0.7 12/20/2022 104.42 0.13 -0.284 0.033 21:00 9 9年 0.6 12/20/2023 103.61 0.19 -0.302 0.033 21:00 10 10年 0.3 12/20/2024 100.54 0.24 -0.276 0.028 21:00 11 15年 2.1 12/20/2029 121.89 0.52 -0.386 0.022 21:00 12 20年 1.2 12/20/2034 105.09 0.90 -0.138 0.008 21:00 13 30年 1.5 12/20/2044 108.98 1.10 -0.428 0.017 21:00
html関数の中にもencodingのオプションがあるが、何か上手くいかなかった。説明に書かれているようにstringiパッケージを使うべきなのかもしれない。最適な方法かどうかはわからないけれども、こちらは大変簡単なのでメモしておく