私はウェブサイトを削り取ろうとしていますが、それは私に間違いを与えます。
私は次のコードを使っています。
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>
これを修正するために私は何ができますか?
.encode("utf-8")
をsoup
に追加することで修正しました。
それはprint(soup)
がprint(soup.encode("utf-8"))
になることを意味します。
スクラップされた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)
Python 3.7では、そしてWindows 10を実行することでこれはうまくいきました(私がそれが他のプラットフォームや他のバージョンのPythonで動くかどうかはわかりません)
この行を置き換える:
with open('filename', 'w') as f:
これとともに:
with open('filename', 'w', encoding='utf-8') as f:
これが機能するのは、ファイルを使用するときにエンコードがUTF-8に変更されているためです。現在のエンコーディングを想定していません。
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)
それでもこのエラーが発生する方は、soup
にencode("utf-8")
を追加しても修正されます。
soup = BeautifulSoup(html_doc, 'html.parser').encode("utf-8")
print(soup)
私があなたがそれを印刷しよう、それを読み書きしようとしたり、それを開いたりしようとするときに起こるエンコーディングに関して同じ問題に直面しました。あなたがそれを印刷しようとしているなら他の人が上で述べたように.encoding = "utf-8"を加えることは助けになるでしょう。
soup.encode( "utf-8")
あなたがスクレイプしたデータを開こうとしていてそれをファイルに書き込もうとしているのなら、(......、encoding = "utf-8")でファイルを開いてください。
open(filename_csv、 'w'、newline = ''、encoding = "utf-8")をcsv_fileとして使用します。