python beautifulsoup urllib

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)