5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BeautifulSoupでスクレイピングするときに文字化けする問題の対処

Last updated at Posted at 2023-10-24

はじめに

スクレイピングをするときにどうしても文字化けしてしまう大変さ...
なんとか解決できたので記録しておく

エラー対処

コードとしては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.textr.contentにすれば治るよ!ってサイトが多すぎて探すのに苦労しました...
なにがともあれ治ってよかった。
とりあえず言えることは日本語はクソということです。

参考サイト

5
5
0

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
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?