web-dev-qa-db-fra.com

UnicodeEncodeError: le codec 'charmap' ne peut pas encoder de caractères

J'essaie de gratter un site Web, mais cela me donne une erreur.

J'utilise le code suivant:

import urllib.request
from bs4 import BeautifulSoup

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

soup = BeautifulSoup(html)

print(soup)

Et j'obtiens l'erreur suivante:

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>

Que puis-je faire pour résoudre ce problème?

133
SstrykerR

Je l'ai corrigé en ajoutant .encode("utf-8") à soup.

Cela signifie que print(soup) devient print(soup.encode("utf-8")).

158
SstrykerR

J'obtenais le même UnicodeEncodeError lorsque je sauvegardais du contenu Web gratté dans un fichier. Pour résoudre ce problème, j'ai remplacé ce code:

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

avec ça:

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

Utiliser io vous donne une compatibilité ascendante avec Python 2.

Si vous devez uniquement prendre en charge Python 3, vous pouvez utiliser la fonction intégrée open:

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

Dans Python 3.7 et sous Windows 10, cela fonctionnait (je ne sais pas si cela fonctionnera sur d'autres plates-formes et/ou d'autres versions de Python).

Remplacer cette ligne:

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

Avec ça:

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

La raison pour laquelle cela fonctionne est que l'encodage est modifié en UTF-8 lors de l'utilisation du fichier. Par conséquent, les caractères en UTF-8 peuvent être convertis en texte au lieu de renvoyer une erreur lorsqu'ils rencontrent un caractère UTF-8. pas suppord par l'encodage actuel.

25
Sabbir Ahmed

Lors de l’enregistrement de la réponse à la requête get, la même erreur était renvoyée sur Python 3.7 dans la fenêtre 10. La réponse reçue à partir de l’URL, le codage étant UTF-8, il est toujours recommandé de vérifier le codage afin que la réponse soit identique. passé pour éviter un problème aussi trivial car il tue vraiment beaucoup de temps en production

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)

Quand j'ai ajouté encoding = "utf-8" avec la commande open, il a sauvegardé le fichier avec la réponse correcte

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

Même moi, j'ai rencontré le même problème d'encodage lorsque vous essayez de l'imprimer, de le lire/l'écrire ou de l'ouvrir. Comme d'autres mentionnés ci-dessus, ajouter .encoding = "utf-8" vous aidera si vous essayez de l'imprimer.

soup.encode ("utf-8")

Si vous essayez d'ouvrir des données récupérées et éventuellement de les écrire dans un fichier, ouvrez le fichier avec (......, encoding = "utf-8")

avec open (filename_csv, 'w', newline = '', encoding = "utf-8") en tant que fichier csv:

6
Pardhu Gopalam

Pour ceux qui obtiennent toujours cette erreur, ajouter encode("utf-8") à soup résoudra également ce problème.

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