はじめに
スクレイピングをするときにどうしても文字化けしてしまう大変さ...
なんとか解決できたので記録しておく
エラー対処
コードとしてはwebサイトからBeautifulSoupで文字を取得してきてcsvに書き込むというもの
文字化けはcsvに書き込むときではなく読み込んだ段階で起きていた。
以下コードの抜粋
from bs4 import BeautifulSoup
import requests
import csv
import textwrap
import re
#urlの指定
url = input("csvファイルに書き出したいサイトのURLを入力してください:")
#urlからwebページを取得
r = requests.get(url)
# print(r.content)
r.encoding = r.apparent_encoding
#webページを分析
soup = BeautifulSoup(r.content, 'html.parser')
t = str(soup.article.header.h1.a.string)
print(t)
printの結果文字化け...
chardetをimportしてサイトの文字コードを調べるとutf-8とのこと。
原因はsoup = Beautiful...
のところっぽいので調べてみて、見つけた対処法をやってみると治った
改善後のコードは以下の通り
from bs4 import BeautifulSoup
import requests
import csv
import textwrap
import re
#urlの指定
url = input("csvファイルに書き出したいサイトのURLを入力してください:")
#urlからwebページを取得
r = requests.get(url)
# print(r.content)
r.encoding = r.apparent_encoding
#webページを分析
soup = BeautifulSoup(r.content, 'html.parser')
soup = BeautifulSoup(r.content.decode("utf-8", "ignore"), "html.parser") #追加
t = str(soup.article.header.h1.a.string)
print(t)
なぜかr.encording
の文字コードではなくsoup
の方で違う文字コードが使われているみたい。soup
の方でも文字コードを指定してやるとうまくいくようだ。
ただ指定するだけではエラーが出るようなので、エラーを無視するためにr.content.decode("utf-8", "ignore")
と書き足せばよい...みたい
その上の行は多分いらない。
おわりに
r.text
をr.content
にすれば治るよ!ってサイトが多すぎて探すのに苦労しました...
なにがともあれ治ってよかった。
とりあえず言えることは日本語はクソということです。
参考サイト