StaticDiary

AI、iOS、Android開発関連の備忘録です

UnicodeEncodeErrorに振り回されたのでメモ

UnicodeEncodeErrorで悩まされた

pythonスクレイピングクローラーの技術を習得しようと最近奮闘中であるのだが、今日はUnicodeEncodeErrorに悩まされた話

 

今は次の書籍を読みながらpythonスクレイパーを作っている最中

 

 

この本は理解しやすくてコードも載っているのだがところどころ修正が必要な箇所がある

 

今回ぶち当たったのがUnicodeEncodeErrorの話

HTTPヘッダーからエンコーディングを取得して、レスポンスボディをデコードしたものを標準出力してファイルに保存する際にまず一回目のUnicodeErrorがでた

 

UnicodeEncodeError: 'cp932' codec can't encode character '©' in position 9261: illegal multibyte sequence

 unicodeにしないとだめだというエラーのよう。ググったら型が違うために出てるらしい。

そういうわけでコードに以下の行を使ってうまくいった

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 

 標準出力をutf-8にエンコできる優れもの

 

まあ、これで出力後にファイルとして保存することができたわけだが、次にこのエンコしたファイルを使って正規表現スクレイピングしてほしいデータを取り出そうとしたときにまたUnicodeEncodeErrorが発生した

 

これはファイルを開く際に型がUnicodeになってないためだったみたい

 

なのでググって開くときに下のようにutf-8エンコードしてみるようにコードを書き換えたところうまくデータを取得できた

with io.open('dp.html', 'r', encoding='utf-8') as f:

 

UnicodeEncodeErrorはやっかいなものでまたどこかで引っかかるかもしれないから残しておく

 

参照:

UnicodeEncodeError: に悩まされない。Python2.x から Python3.x への乗り換え