#概要
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
- スクレイピング対象となるページは様々な文字コードで作られているため、スクレイピング時に自動で任意の文字コードでデコードされる
- 対象となる文字コードはOS依存で、windowsではCP932(shift_jis)が選択される
- これは日本語用の文字コードで、**\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 ウルフギャング・ズウィナー 大阪店']
[]
['ぶどう畑']
[]
['墨国回転鶏料理 ルクア店']