UnicodeEncodeError: 'charmap'コーデックは文字をエンコードできません


205

Webサイトをスクレイピングしようとしていますが、エラーが発生します。

次のコードを使用しています。

import urllib.request
from bs4 import BeautifulSoup

get = urllib.request.urlopen("https://www.website.com/")
html = get.read()

soup = BeautifulSoup(html)

print(soup)

そして、私は次のエラーを受け取ります:

File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 70924-70950: character maps to <undefined>

これを修正するにはどうすればよいですか?

回答:


258

UnicodeEncodeError削られたWebコンテンツをファイルに保存するときにも同じようになりました。それを修正するために、私はこのコードを置き換えました:

with open(fname, "w") as f:
    f.write(html)

これとともに:

import io
with io.open(fname, "w", encoding="utf-8") as f:
    f.write(html)

を使用するioと、Python 2との下位互換性が得られます。

Python 3のみをサポートする必要がある場合は、open代わりに組み込み関数を使用できます。

with open(fname, "w", encoding="utf-8") as f:
    f.write(html)

6
mac(python 3)では、エンコードせずに単に開くだけで完全に動作しますが、windows(w10、python3)ではオプションではありません。encoding = "utf-8"パラメータを使用すると、そのように機能します。
xtornasol512 2017

3
ありがとうございました。それは私にとってはうまくいきました、私はxmlファイルで作業していて、xml.toprettyxml()の結果を新しいファイルに書いていました
Luis Cabrera Benito

1
これは、バイトの文字列表現ではなく、最終的に文字列を出力に書き込むため、受け入れられる答えになるはずです。
Shirkan

OPはファイルの読み取りを要求しましたが、ファイルの書き込みは要求しませんでした。問題はコンソールに関連しているようです。
NaturalBornCamper

187

追加.encode("utf-8")して修正しましたsoup

つまり、にprint(soup)なりprint(soup.encode("utf-8"))ます。


3
スクリプト内に環境(たとえば、コンソール)の文字エンコードをハードコーディングせず、代わりに直接Unicodeを出力します
jfs

これはbytesオブジェクトのreprを出力するだけで\xあり、UTF-8でエンコードされたテキストがたくさんある場合、シーケンスの混乱として出力されます。win_unicode_console@JFSebastianが示唆するように、を使用することをお勧めします。
Eryk Sun、2016

2
私は上記のソリューションを使用しましたが、問題が発生しました:クラスMyStreamListener(tweepy.StreamListener):def on_status(self、status):print(str(status.encode( "utf-8")))UnicodeEncodeError: 'charmap' codec can ' tの文字 '\ u2019'を87桁目にエンコードします。文字は<undefined>にマップされます
Vivek

2
これにより、b'\x02x\xc2\xa9'代わりに出力されます(バイトオブジェクト)
MilkyWay90

1
print(soup.encode("utf-8"))私のために働いたが、その前に私はまた追加しなければならなかったwith open("f_name", encoding="utf-8") as f: soup = BeautifulSoup(f, "html.parser")
TheWalkingData

44

Python 3.7で、Windows 10を実行するとこれは機能しました(他のプラットフォームやPythonの他のバージョンで機能するかどうかはわかりません)

この行を置き換える:

with open('filename', 'w') as f:

これとともに:

with open('filename', 'w', encoding='utf-8') as f:

これが機能する理由は、ファイルを使用するときにエンコードがUTF-8に変更されるため、UTF-8の文字が次のようなエラーに遭遇したときにエラーを返す代わりに、UTF-8の文字をテキストに変換できるためです現在のエンコーディングではサポートされていません。


1
print(soup)return \ xd0 \ xbf \ xd0 \ xbe \ xd0 \ xb6 \ xd0 \ xb0 \ xd0 \ xbb \ xd1 \ x83 \ xd0 \ xb9 \ xd
Coffee inTime

12

get要求の応答を保存しているときに、ウィンドウ10のPython 3.7で同じエラーがスローされました。URLから受け取った応答はエンコーディングがUTF-8だったため、このような些細な問題を回避するために、エンコーディングを確認して渡すことが常に推奨されています。それは本当に生産の多くの時間を殺すので

import requests
resp = requests.get('https://en.wikipedia.org/wiki/NIFTY_50')
print(resp.encoding)
with open ('NiftyList.txt', 'w') as f:
    f.write(resp.text)

openコマンドでencoding = "utf-8"を追加すると、正しい応答でファイルが保存されました

with open ('NiftyList.txt', 'w', encoding="utf-8") as f:
    f.write(resp.text)

10

それを印刷したり、読み書きしたり、開いたりしようとすると、同じエンコードの問題が発生しました。上で述べたように、.encoding = "utf-8"を追加すると、印刷する場合に役立ちます。

soup.encode( "utf-8")

スクレイピングされたデータを開こうとして、ファイルに書き込む場合は、(......、encoding = "utf-8")でファイルを開きます。

open(filename_csv、 'w'、newline = ''、encoding = "utf-8")をcsv_fileとして:


6

それでもこのエラーが発生する場合は、を追加encode("utf-8")するsoupと、これも修正されます。

soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)

2
soupBeautifulSoupこれを実行した後はオブジェクトではなくなったため、操作または検索できません
NaturalBornCamper
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.