0
4

More than 3 years have passed since last update.

python スクレイピング時における UnicodeEncodeError: 'cp932'

Last updated at Posted at 2020-10-05

概要

goToEatの店名一覧から店名のみを抽出し、CSVに出力したい。

Beautifulsoup
requests
python3
windows10

を利用している。

エラー内容と理由

以下のコードでhtmlタグを指定してタグを含めた店名をリストの形で抽出できた


        urlName = "https://premium-gift.jp/eatosaka/use_store?events=page&id={}&store=&addr=&industry=".format(PageNumber)
        dataHTML = requests.get(urlName)
        soup = BeautifulSoup(dataHTML.content, "html.parser")
        elems = soup.select('h3.store-card__title')

余分な情報をreplaceし削除してCSVに出力する。i.textでテキスト情報を取得できると教えていただきました。

    with open(r'C:\Users\daisuke\Desktop\python\eat.csv', 'w') as f:
        writer = csv.writer(f)
        for i in elems:
            """
            i = str(i)
            i = i.replace('<h3 class="store-card__title">', '')
            i = i.replace('</h3>', '')
            i = i.replace('  ', '  ')
            i = i.replace(' ', ' ')
            """
            print(i.text)

            try:
                writer.writerow([i.text])
            except:
                writer.writerow(['error'])

以下のエラーが発生

活伊勢海老料理中納言  大阪駅前第三ビル店
Traceback (most recent call last):
  File "C:\Users\daisuke\Desktop\python\go_to_eat.py", line 24, in <module>
    writer.writerow(i)
UnicodeEncodeError: 'cp932' codec can't encode character '\xa0' in position 20: illegal multibyte sequence

参考1参考2によると

  1. スクレイピング対象となるページは様々な文字コードで作られているため、スクレイピング時に自動で任意の文字コードでデコードされる
  2. 対象となる文字コードはOS依存で、windowsではCP932(shift_jis)が選択される
  3. これは日本語用の文字コードで、\xa0(ノーブレークスペース)には対応していない

解決方法

そこで以下のようにノーブレークスペースを半角スペースに置き換えて対応しました。
いわば対症療法的やりかたでよくないですね


        for i in elems:
            i = str(i)
            i = i.replace('<h3 class="store-card__title">', '')
            i = i.replace('</h3>', '')
            i = i.replace('  ', '  ')
            i = i.replace(' ', ' ')
            print(i)

            try:
                writer.writerow([i])
            except:
                writer.writerow(['error'])

恐らく一番良いのは問題の文字をきちんと表現できる文字コードを指定してやることではないでしょうか。次のように、 open()関数に encoding キーワード引数を与えてやると、自動変換で使用される文字コードを直接指定することができますから、これを Unicode 文字が表現できる UTF-8 等にしてやればいいわけです。

CSVファイルを開いた際に文字化けしてしまいますが、文字コードを変更すれば大丈夫です。


with open(r'C:\Users\daisuke\Desktop\python\eat.csv', 'w', encoding='utf-8') as f:

しかし、CSVからreadした際に以下のように不要な空白列が追加されてしまいました。
これはまだなぜかわかっていません。詳しい方がコメントで教えてくださり解決しました!
ありがとうございます

['ウルフギャング・ステーキハウス by ウルフギャング・ズウィナー 大阪店']
[]
['ぶどう畑']
[]
['墨国回転鶏料理  ルクア店']
0
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4