質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

1050閲覧

xmlInternalTreeParseを使うと文字化けしてしまう

akutoukuroneko

総合スコア5

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/09/23 05:20

編集2021/09/24 00:02

前提・実現したいこと

Rで取得したAPIのテキストをリスト化してcsvファイルに出力したいと考えています。

発生している問題・エラーメッセージ

以下の該当のソースコードの #ここからです のところをRUNすると、数字とアルファベットで文字化けしたツリーが出てきます。

該当のソースコード

R

1library(httr) 2library(XML) 3library(xml2) 4library(rlist) 5library(stringr) 6library(dplyr) 7library(readxl) 8 9base_url <- "https://kokkai.ndl.go.jp/api/speech?" 10 11payload <- "any=世間&maximumRecords=100&from=2010-04-01&until=2020-03-31&startRecord=1" 12r <- GET(URLencode(paste0(base_url, payload))) 13rtxt <- content(r, "text", encoding = "utf8") 14 15#ここからです 16rtree <- xmlInternalTreeParse(rtxt, ignoreBlanks = TRUE)

試したこと

以下の日本語でよくあるエンコードは試しました。

・encoding = "utf8"にした
→今度は漢字で文字化けしたツリーが出てくる

・encoding = "Shift-JIS"にした
→以下のようなエラーが出る

R

1> rtree <- xmlInternalTreeParse(rtxt, ignoreBlanks = TRUE, encoding = "Shift-JIS") 2input conversion failed due to input error, bytes 0x86 0xE8 0xAD 0xB0 3input conversion failed due to input error, bytes 0x86 0xE8 0xAD 0xB0 4encoder errorPremature end of data in tag nameOfHouse line 1 5Premature end of data in tag speechRecord line 1 6Premature end of data in tag recordData line 1 7Premature end of data in tag record line 1 8Premature end of data in tag records line 1 9Premature end of data in tag data line 1 10Error: 1: input conversion failed due to input error, bytes 0x86 0xE8 0xAD 0xB0 112: input conversion failed due to input error, bytes 0x86 0xE8 0xAD 0xB0 123: encoder error4: Premature end of data in tag nameOfHouse line 1 135: Premature end of data in tag speechRecord line 1 146: Premature end of data in tag recordData line 1 157: Premature end of data in tag record line 1 168: Premature end of data in tag records line 1 179: Premature end of data in tag data line 1

・encoding = "cp932"にした
→"Shift-JIS"と同じエラーが出る

補足情報(FW/ツールのバージョンなど)

・実行したOS Windows10
・使用したRのversion Rx64 4.1.1
・使用したIDE Rstudio 1.4

追記
・rtxtの時点ではきちんと文字化けせずに出力されます。

他必要事項ございましたら追記依頼お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

取得されたデータはUTF-8で書かれたXMLフォーマットのテキストに間違いなさそうですが、メタ情報が含まれていません。

https://www.rdocumentation.org/packages/XML/versions/3.99-0.6/topics/xmlTreeParse
を見る限り、当該の関数はメタ情報に含まれるエンコーディング指定(こういうやつ:<?xml version="バージョン" encoding="文字コード" ?>)を読み取って適切に処理しようとするようですが、それが無いため、明示的にencodingオプションを指定する必要があると思います。

追記(2021-09-25)

こんな環境で、

> sessionInfo() R version 4.0.3 (2020-10-10) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 19043) Matrix products: default Random number generation: RNG: Mersenne-Twister Normal: Inversion Sample: Rounding locale: [1] LC_COLLATE=Japanese_Japan.932 LC_CTYPE=Japanese_Japan.932 LC_MONETARY=Japanese_Japan.932 [4] LC_NUMERIC=C LC_TIME=Japanese_Japan.932 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] XML_3.99-0.8 readxl_1.3.1 forcats_0.5.0 stringr_1.4.0 dplyr_1.0.2 [6] purrr_0.3.4 readr_1.4.0 tidyr_1.1.2 tibble_3.0.4 ggplot2_3.3.2 [11] tidyverse_1.3.0 xml2_1.3.2 httr_1.4.2 (以下略)

次のように、ふつうに表示できました。

> rtree <- xmlInternalTreeParse(rtxt, ignoreBlanks=T, encoding="utf8") > getNodeSet(rtree, "(//speech)[1]") [[1]] <speech>○階委員 なぜ運用したのかというと、要するに、黒川氏の定年の延長を認めるためにやったというふうにしか捉えられないわけですよね。それ以外の理由は全く考えられないし、きょうは、一般論として聞いても、全く答えが返ってこないんですよ。  ですから、要は、黒川氏のために、法改正の前に今回の解釈変更を行ったというふうに捉えられる。これはもう、世間一般から見て必ずそうなると思いますよ。それに対して、そうじゃないんだというふうに反論してもらわないと、これは法の支配じゃなくて人の支配ということになると思いますね。  ちゃんと、一般論として、なぜ法改正の前に運用を開始しなくちゃいけなかったのかということを説明してもらわないと、私だけではなくて、国民は納得しないと思いますよ。そこをちゃんと説明してくださいよ。説明できないのなら、黒川氏のためでしたというふうに認定せざるを得ません。どうですか、大臣。</speech> attr(,"class") [1] "XMLNodeSet"

こんな情報もあるようなので、バージョンをチェックしてみる必要があるかもしれません。

投稿2021/09/23 06:50

編集2021/09/25 12:37
KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akutoukuroneko

2021/09/23 09:01 編集

それはrtxt <- content(r, "text", encoding = "utf8")が問題というでしょうか、それとも追加でversion指定できるということでしょうか。「国会会議録検索システム 検索用APIの仕様」には返戻に <?xml version="1.0"?>とあるのですが https://kokkai.ndl.go.jp/api.html
KojiDoi

2021/09/23 10:30

あなたがみたいのはこれですよね。 https://kokkai.ndl.go.jp/api/speech?any=世間&maximumRecords=100&from=2010-04-01&until=2020-03-31&startRecord=1 これをブラウザでもwgetでもいいので直接ダウンロードしてみてください。ヘッダがついてないでしょ。 そして、xmlTreeParseの方の説明をみると、encodingというパラメータがあって、This is optional as the document should contain its own encoding information. However, if it doesn't, the caller can specify this for the parser.とあります。これらを総合すれば、何を書き足すべきはわかりますよね。 ついでにいうとマニュアルに書いてあることが必ずしも絶対正しいとは限りません。システムがバージョンアップして細かい仕様が変わっているのにドキュメントの整備が追いついていないのはよくあることです。書いてあることを鵜呑みにせず、中間データを自分の目で確かめてみることも大切ですよ。
akutoukuroneko

2021/09/23 23:56 編集

なるほど、たしかにヘッダーはついていないです。 ただ、私もそれを読んで、「試したこと」にあるようにencodingでUTF-8, Shift-JIS(CP932)を指定してみても文字化けするというので、今回質問させていただきました。なので、正直言うとそれ以上何を書き足すべきかわかりません。
akutoukuroneko

2021/09/27 11:48

KojiDoiさん、ありがとうございました。 いただいたコードで、getNodeSetを使っていなかったので文字化けしてしまっていたようで、これを通したらきちんと文字化けせずに出力されました。 これはR4.0.3でもR4.1.1でも変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問