実現したいこと
取得した文字列をデコードしたい。
生じている問題
スクレイピングによって取得した文字列がUnicodeエスケープシーケンスで記述されており、これをデコードするためのコードを実行したところエラーが表示されました。
当該のソースコード
Python3.10.1
1mport stweet as st 2 3def try_serch(): 4 5search_tweets_task = st.SearchTweetsTask(all_words = "検索ワード") 6output_jl_tweets = st.JsonLineFileRawOutput('data.txt') 7output_print = st.PrintRawOutput() 8 9st.TweetSearchRunner(search_tweets_task=search_tweets_task, 10tweet_raw_data_outputs=[output_print, output_jl_tweets], 11user_raw_data_outputs=[]).run() 12 13if __name__ == "__main__": 14try_serch() 15
Python3.10.1
1source = open('data.txt','r') 2out = open('data_decoded.txt','w') 3 4for row in source: 5 new = row.encode().decode('unicode-escape') 6 out.write(new) 7 8source.close() 9out.close()
エラー
utf-8変換前
Traceback (most recent call last): File "c:\VSCode\Source\Python\Scraping\Encoder.py", line 6, in <module> out.write(new) UnicodeEncodeError: 'cp932' codec can't encode character '\ud83d' in position 266: illegal multibyte sequence
変換後
Traceback (most recent call last): File "c:\VSCode\Source\Python\Scraping\Encoder.py", line 6, in <module> out.write(new) UnicodeEncodeError: 'utf-8' codec can't encode characters in position 266-267: surrogates not allowed
作成されたテキストファイルの変換したい部分
"full_text" : "\u3053\u308C\u306F\u30C6\u30B9\u30C8"
このような記述がされており、その一部分である\ud83dが引っかかったようです。
特に分からないこと
utf-8とcp932の食い違いであるということは記事を読んで理解できました。そのためファイルの読み書き時にutf-8でコーディングを行ってみましたが上手く動きません。どこを見落としているのでしょうか?
Python
1source = open('data.txt','r',encoding='utf-8') 2out = open('data_decoded.txt','w',encoding='utf-8')
至らない点が多々あると思いますが、ご回答よろしくお願いします。
Tracebackがないのでどこでエラーがでたのかわかりません。
utf-8にした場合も「上手く動きません」とだけあって何が起こったのかわかりません。
今Pythonを使ってファイル開けていない状態で、「Unicodeエスケープシーケンスで記述されて」いると思ったのはなぜか(なにを使ってどうなったからそう判断したのか)もあるとよいと思います。
結果から考えると単純に「そのファイルはテキストではない」可能性が高そうなのですが、ファイルはどのようにして作られたのでしょうか?
情報不足で申し訳ありません。
テキストファイルを作成するのはstweetを使用した以下のコードなのですが、
import stweet as st
def try_serch():
search_tweets_task = st.SearchTweetsTask(all_words = "検索ワード")
output_jl_tweets = st.JsonLineFileRawOutput('data.txt')
output_print = st.PrintRawOutput()
st.TweetSearchRunner(search_tweets_task=search_tweets_task,
tweet_raw_data_outputs=[output_print, output_jl_tweets],
user_raw_data_outputs=[]).run()
if __name__ == "__main__":
try_serch()
これによって作成されたファイルdata.txtを確認すると検索ワードに引っかかった文字列が、Unicodeエスケープシーケンスでテキストファイル内に記述されていたためそう判断しました。
またutf-8に変換前は
Traceback (most recent call last):
File "c:\VSCode\Source\Python\Scraping\Encoder.py", line 6, in <module>
out.write(new)
UnicodeEncodeError: 'cp932' codec can't encode character '\ud83d' in position 266: illegal multibyte sequence
返還後は
Traceback (most recent call last):
File "c:\VSCode\Source\Python\Scraping\Encoder.py", line 6, in <module>
out.write(new)
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 266-267: surrogates not allowed
となりました。
情報はこの欄ではなくて質問を編集して追記してください。
> これによって作成されたファイルdata.txtを確認すると検索ワードに引っかかった文字列が、Unicodeエスケープシーケンスでテキストファイル内に記述されていたため
テキストエディタで見ると全部ASCIIの範囲の文字になっていて、中に \ud83d という文字列が見えるということで合ってますか。
追記: \ud83d は今エラーになっている部分で、これを検索すると本当にそこにあるのかと思って書きました。
編集した部分のような文字列が表示され、その中に\ud83dという文字列が含まれていました。

回答1件
あなたの回答
tips
プレビュー