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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1842閲覧

reライブラリのsearchで取得した文字列がdecodeできない

sku_gh

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/09 16:48

編集2019/08/11 05:40

re.searchで取得した文字列をprintすると

python

1\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a

こう表示されるので、デコードしようと.decode("unicode-escape")を使ったのですが

console

1AttributeError: 'str' object has no attribute 'decode'

エラーが出てしまいます。どうすればうまく変換できるのでしょうか?

追記です(説明不足で申し訳ありません)

環境
・windows10
・python3.7.4
・visual studio code使用
・コマンドプロンプトにて実行

まず、もともとやりたかったのはwebスクレイピングです。webページのソース内にに下記のようなjsがありました。

javascript

1window.content_Data_k = { 2 "config": { 3 "token": "dsf78sadf9sdfasd7s9df7safd6", 4 "seer": null, 5 "seerId": null 6 }, 7 "country_code": "JP", 8 "language_code": "ja", 9 "locale": "ja_JP", 10 "index_data": { 11 "contentPage": [{ 12 "logging_page_id": "contentPage_728394298", 13 "show_suggested_contents": false, 14 "graphql": { 15 "user": { 16 "name": "aaa", 17 "comment":"\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a", 18 "block": false, 19 "country_block": false, 20 "expect_url": null, 21 "expect_url_linkshimmed": null, 22 "key_number": { 23 "count": 13 24 } 25 } 26 } 27 }] 28 } 29}

この中から"\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a"の部分を取得したかったので、comment = re.search(r'"comment"\s*:\s*"([^"]*)"',page_source).group(1)として取得しました。引数page_sourceにはrequestsライブラリで取得した、webページのソースすべてが代入されています。最後にprint(comment)すると、\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4aがそのまま表示されてしまうわけです。

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

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

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

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

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

quickquip

2019/08/10 08:30 編集

元のコードとデータがないのが混乱の元かと。"re.searchで取得した"の時点で遠回りなことをやっている可能性も高いのでは?
sku_gh

2019/08/11 05:36

了解です。追記しておきました。説明不足で申し訳ありません。
meg_

2019/08/11 11:05

追記について確認です。 これはwebにアクセスした結果がjsonで返ってくるということでしょうか? であれば、urllib.requestモジュールやjsonモジュールで対応できそうですが。 (違う場合は分かりませんね・・・)
sku_gh

2019/08/11 14:56 編集

requestsモジュールを使って ``` response = requests.get(url) #urlにはそのまんまサイトのURLが文字列として入ります page_source = response.text ``` こう書いております。response.text属性でページのソースをただ単に文字列として取得できるのかと思いましたが、この理解が間違っているのでしょうか?調べたのですが、よくわかりませんでした。
quickquip

2019/08/11 14:58

取得しているのはhtmlで、その中のscript要素をさらに抜粋して引用したように見えますね。
guest

回答2

0

ベストアンサー

python

1b='\u9577\u5d0e\u51fa\u8eab\u3067\u3059' 2>>> b.encode().decode() 3'長崎出身です'

OS:Windows

※\ud83d\udd4aは「'utf-8' codec can't encode character」となりましたので除外しました。

投稿2019/08/09 23:03

meg_

総合スコア10577

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

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

sku_gh

2019/08/10 08:24

回答ありがとうございます。上記の.encode().decode()を使ったのですが、'\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a'がそのまま表示されてしまいます...
meg_

2019/08/10 08:47

コードを全て質問に追記してもらえませんか? あと環境(OSとかpythonのバージョンとか)を明記願います。
sku_gh

2019/08/11 05:39

了解です。追記しておきました。説明不足で申し訳ありません。
meg_

2019/08/11 15:33

「b.encode().decode('unicode-escape')」はどうでしょうか?
sku_gh

2019/08/11 17:01 編集

.encode().decode('unicode-escape')で文字列が絵文字なしの場合は見事変換できました!ありがとうございます!ただ、絵文字が入っているときはエラーが出てしまいました...
meg_

2019/08/12 04:34

b.encode().decode('unicode-escape').encode('utf-16', 'surrogatepass').decode('utf-16') こちらはどうですか?  ※Window8では絵文字(鳩?)の表示確認は出来ませんでしたが ※can110さんの回答を参考にさせていただきました
sku_gh

2019/08/12 10:03

無事に絵文字も変換することができました!本当にありがとうございます!ベストアンサーとさせていただきますね。
guest

0

以下でいけました。
参考:Pythonでサロゲートペア -- ほっけの逆襲

Python

1s = '\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a' 2s = s.encode('utf-16', 'surrogatepass').decode('utf-16') 3print(s) # 長崎出身です????

追記

提示されたデータとコード片でもWin10,Python3.6.7,コマンドプロンプト環境にてprintできました。また、ファイル出力結果も正常です。

Python

1import re 2 3page_source = """window.content_Data_k = { 4 "config": { 5 "token": "dsf78sadf9sdfasd7s9df7safd6", 6 "seer": null, 7 "seerId": null 8 }, 9 "country_code": "JP", 10 "language_code": "ja", 11 "locale": "ja_JP", 12 "index_data": { 13 "contentPage": [{ 14 "logging_page_id": "contentPage_728394298", 15 "show_suggested_contents": false, 16 "graphql": { 17 "user": { 18 "name": "aaa", 19 "comment":"\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a", 20 "block": false, 21 "country_block": false, 22 "expect_url": null, 23 "expect_url_linkshimmed": null, 24 "key_number": { 25 "count": 13 26 } 27 } 28 } 29 }] 30 } 31}""" 32 33comment = re.search(r'"comment"\s*:\s*"([^"]*)"',page_source).group(1) 34#print(comment) # UnicodeEncodeError: 'utf-8' codec can't encode characters in position 6-7: surrogates not allowed 35 36comment = comment.encode('utf-16', 'surrogatepass').decode('utf-16') 37 38# ファイルに出力 39with open('ret.txt', 'w', encoding='utf-16') as f: 40 f.write(comment) 41 42print(comment) # 長崎出身です????

イメージ説明

投稿2019/08/09 17:07

編集2019/08/11 22:53
can110

総合スコア38233

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

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

sku_gh

2019/08/10 08:23

回答ありがとうございます。上記の.encode('utf-16', 'surrogatepass').decode('utf-16')を使ったのですが、'\u9577\u5d0e\u51fa\u8eab\u3067\u3059\ud83d\udd4a'がそのまま表示されてしまいます...
can110

2019/08/10 09:33

回答コードをそのまま実行しても同様でしょうか? 環境による可能性もあるのでOS、コードを実行した環境(ターミナル、Jupyterなど)についての情報を質問本文に追記ください。 また、追記修正依頼にも書かれていますが、実際にやりたいことやより広範囲なコードを提示すると別の観点からの回答が得られやすくなる可能性が高くなります。
sku_gh

2019/08/11 05:40

了解です。追記しておきました。説明不足で申し訳ありません。
meg_

2019/08/11 09:57

そのページの文字コード(charset)は何でしょうか?(utf-8だとは思うのですが。。)
can110

2019/08/11 10:02

繰り返しになりますが、回答コードをそのまま実行しても同様でしょうか?
sku_gh

2019/08/11 14:51 編集

もしかしたら、前のソースに問題があるかもしれないです。 ``` response = requests.get(url) #urlにはそのまんまサイトのURLが文字列として入ります page_source = response.text ``` 問題はここにあるのでしょうか? 文字コードはutf-8でした。また、解答コードはそのまま実行しました。
can110

2019/08/11 22:55

回答コードでも再現するとなると、ちょっと不可解な現象ですね。 回答コードを修正しました。 環境(print)に問題がないかを切り分けるためにファイル出力してみてください。
sku_gh

2019/08/12 03:43

.encode().decode('unicode-escape')で文字列が絵文字なしの場合は見事変換できたのですが、絵文字ありの場合はsurrogatepassが許可されていないとエラーが出ました。
can110

2019/08/12 03:47

当方の回答コードは「.encode('utf-16', 'surrogatepass').decode('utf-16')」です。 「.encode().decode('unicode-escape')」ではありません。 また、エラーメッセージは省略せずにそのまますべてを提示ください。
sku_gh

2019/08/12 03:50 編集

いえ、.encode().decode('unicode-escape')はmeg_さんが回答したものです。エラーコードについては、ちょっと今PCが使えない状態にあるのでもう少々お待ちください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問