Codificación del problema de un personaje en utf-8

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 .