python - UnicodeEncodeError: el códec ''charmap'' no puede codificar caracteres
beautifulsoup urllib (6)
Estoy tratando de raspar un sitio web, pero me da un error.
Estoy usando el siguiente código:
import urllib.request
from bs4 import BeautifulSoup
get = urllib.request.urlopen("https://www.website.com/")
html = get.read()
soup = BeautifulSoup(html)
print(soup)
Y obtengo el siguiente error:
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>
¿Qué puedo hacer para arreglar esto?
Al guardar la respuesta de la solicitud get, se arrojó el mismo error en Python 3.7 en la ventana 10. La respuesta recibida de la URL, la codificación fue UTF-8, por lo que siempre se recomienda verificar la codificación para que se pueda pasar para evitar un problema tan trivial ya que realmente mata mucho tiempo en producción
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)
Cuando agregué encoding = "utf-8" con el comando abierto, guardé el archivo con la respuesta correcta
with open (''NiftyList.txt'', ''w'', encoding="utf-8") as f:
f.write(resp.text)
En Python 3.7, y ejecutar Windows 10 esto funcionó (no estoy seguro de si funcionará en otras plataformas y / u otras versiones de Python)
Reemplazando esta línea:
with open(''filename'', ''w'') as f:
Con este:
with open(''filename'', ''w'', encoding=''utf-8'') as f:
La razón por la que funciona es porque la codificación se cambia a UTF-8 cuando se usa el archivo, por lo que los caracteres en UTF-8 pueden convertirse a texto, en lugar de devolver un error cuando encuentra un carácter UTF-8 que es no suppord por la codificación actual.
Estaba obteniendo el mismo
UnicodeEncodeError
al guardar contenido web raspado en un archivo.
Para solucionarlo, reemplacé este código:
with open(fname, "w") as f:
f.write(html)
con este:
import io
with io.open(fname, "w", encoding="utf-8") as f:
f.write(html)
El uso de
io
le brinda compatibilidad con Python 2.
Si solo necesita admitir Python 3, puede utilizar la función de
open
integrada en su lugar:
with open(fname, "w", encoding="utf-8") as f:
f.write(html)
Incluso me enfrenté al mismo problema con la codificación que ocurre cuando intentas imprimirlo, leerlo / escribirlo o abrirlo. Como otros mencionaron anteriormente, agregar .encoding = "utf-8" ayudará si está intentando imprimirlo.
soup.encode ("utf-8")
Si está intentando abrir datos raspados y tal vez escribirlos en un archivo, abra el archivo con (......, encoding = "utf-8")
con abierto (filename_csv, ''w'', newline = '''', encoding = "utf-8") como csv_file:
Lo arreglé agregando
.encode("utf-8")
a la
soup
.
Eso significa que
print(soup)
convierte en
print(soup.encode("utf-8"))
.
Para aquellos que todavía reciben este error, agregar
encode("utf-8")
a la
soup
también solucionará esto.
soup = BeautifulSoup(html_doc, ''html.parser'').encode("utf-8")
print(soup)