PythonでツイッターのAPIを用いてツイートデータをスクレイピングして形態素解析を行っていたところ以下のようなエラーに遭遇しました。
<作業環境>
- Windows10
- Jupyterlab
- Python3.7
cp932 codec can't encode character '\u014d'in position6: ilegal multibyte sequence
解決方法としては、エンコードの際の文字コードをutf-8に指定する、エラーを無視するの2通りが存在します。
スクレイピング対象となるページは、ページによって様々な文字コードで作られていますが、そのままでは扱いづらいので、まずこれをデコードして Python 内部の Unicode 文字列表現に揃えてやります
これを行っているのが.requestsのtext属性にアクセスするres.textの部分です。
# 受信したバイト列をデコードして文字列にする res = res.text
このテキストを writer.writerow([name])
やで書き出すわけですが、Pythonでtxtやcsvファイルに書き出す時には Python の内部表現をそのまま書き出すわけにはいきませんので、何らかの文字コードでエンコードし、バイト列にしてから書いてやることになります。
この時 Python 3 はデフォルトの文字コードとして 実行している OS の言語環境の文字コード を選択してしまいます。そして日本語の Windows では、その文字コードは CP932 と呼ばれるものになっています。
CP932 は Shift_JIS とは若干異なりますが日本語の文字コード一種です、 CP932 は日本語用の文字コードなので、英語でよく使われるUnicode文字をエンコードしようとするとエンコードエラーを起こします。
こういった場合の対処法として恐らく一番良いのはエラーの対象になっている文字をきちんと表現できる文字コードを指定することで、open()
関数に encoding='utf-8'
というキーワード引数を加えることで解決します。
またエラーを無視するのも策の1つでOpen関数にerrors='ignore'
というキーワード引数を加えることでも解決します。
例
with open('test.csv', 'wb',encoding='utf-8', errors='ignore') as f: f.write(['2021-11-01', 'テスト', 'こんにちは'])
終わり
MACやLINUXがUTF-8であるのに対して、日本で発売されているWindowsの文字コードはCP932なので、同じコードでもMACやLINUX環境で書かれた内部でエンコードで行っている系のプログラムをそのままコピペして実行しようとすると文字コードの関係でエラーになることがあるので注意しましょう。
コメント