Obtengo un enlace desde una página web mediante el uso de beautiful soup library a través de a.get('href')
. En el enlace hay un personaje extraño ®
pero cuando lo consigo se convirtió en ®
. ¿Cómo puedo codificarlo correctamente? Ya he agregado al principio de la página # -*- coding: utf-8 -*-
r = requests.get(url) soup = BeautifulSoup(r.text)
No utilice r.text
; deja la deencoding a BeautifulSoup
:
soup = BeautifulSoup(r.content)
r.content
le da la respuesta en bytes, sin deencoding. r.text
por otro lado, es la respuesta decodificada a unicode
.
Lo que sucede es que el servidor no incluyó el conjunto de caracteres en los encabezados de respuesta. En ese momento, las requests
siguen el HTTP RFC 2261, sección 3.7.1 : se espera que el text/
respuestas de forma predeterminada utilicen el conjunto de caracteres ISO-8859-1 (Latin 1).
Para tu página HTML, ese valor predeterminado es incorrecto y obtuviste resultados incorrectos; r.text
decodificó los bytes como Latin-1, resultando en un Mojibake :
>>> print u'®'.encode('utf8').decode('latin1') ®
El propio HTML puede incluir la encoding correcta en la propia página HTML , en forma de una etiqueta en el encabezado HTML. BeautifulSoup usará ese encabezado y decodificará los bytes por ti.
Incluso si falta la etiqueta de encabezado , BeautifulSoup incluye otros métodos para detectar automáticamente las codificaciones .