web-dev-qa-db-ja.com

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

私はウェブサイトを削り取ろうとしていますが、それは私に間違いを与えます。

私は次のコードを使っています。

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>

これを修正するために私は何ができますか?

114
SstrykerR

.encode("utf-8")soupに追加することで修正しました。

それはprint(soup)print(soup.encode("utf-8"))になることを意味します。

142
SstrykerR

スクラップされたWebコンテンツをファイルに保存するときに、私は同じUnicodeEncodeErrorを得ました。それを修正するために、私はこのコードを置き換えました:

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)
127
twasbrillig

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

この行を置き換える:

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

これとともに:

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

これが機能するのは、ファイルを使用するときにエンコードがUTF-8に変更されているためです。現在のエンコーディングを想定していません。

23
Sabbir Ahmed

Get requestの応答を保存している間に、ウィンドウ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)
6
Abhishek Jain

それでもこのエラーが発生する方は、soupencode("utf-8")を追加しても修正されます。

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

私があなたがそれを印刷しよう、それを読み書きしようとしたり、それを開いたりしようとするときに起こるエンコーディングに関して同じ問題に直面しました。あなたがそれを印刷しようとしているなら他の人が上で述べたように.encoding = "utf-8"を加えることは助けになるでしょう。

soup.encode( "utf-8")

あなたがスクレイプしたデータを開こうとしていてそれをファイルに書き込もうとしているのなら、(......、encoding = "utf-8")でファイルを開いてください。

open(filename_csv、 'w'、newline = ''、encoding = "utf-8")をcsv_fileとして使用します。

2
Pardhu Gopalam