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?
Je l'ai corrigé en ajoutant .encode("utf-8")
à soup
.
Cela signifie que print(soup)
devient print(soup.encode("utf-8"))
.
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)
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.
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)
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:
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)