Estoy un poco sorprendido de que sea tan complicado obtener un juego de caracteres de una página web con Python. ¿Me estoy perdiendo una manera? HTTPMessage tiene muchas funciones, pero no esto.¿Cuál es una manera breve buena y confiable de obtener el juego de caracteres de una página web?
>>> google = urllib2.urlopen('http://www.google.com/')
>>> google.headers.gettype()
'text/html'
>>> google.headers.getencoding()
'7bit'
>>> google.headers.getcharset()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: HTTPMessage instance has no attribute 'getcharset'
Así que tienes que obtener el encabezado y dividirlo. Dos veces.
>>> google = urllib2.urlopen('http://www.google.com/')
>>> charset = 'ISO-8859-1'
>>> contenttype = google.headers.getheader('Content-Type', '')
>>> if ';' in contenttype:
... charset = contenttype.split(';')[1].split('=')[1]
>>> charset
'ISO-8859-1'
Esa es una cantidad sorprendente de pasos para una función tan básica. ¿Me estoy perdiendo de algo?
De RFC 2616 (HTTP1.1) 'El El parámetro "charset" se usa con algunos tipos de medios para definir el juego de caracteres (sección 3.4) de los datos. Cuando el remitente no proporciona ningún parámetro de juego de caracteres explícito, los subtipos de medios del tipo "texto" se definen para tener un valor de juego de caracteres predeterminado de "ISO-8859-1" cuando se recibe a través de HTTP., Como una nota al margen por defecto siendo ASCII – plundra
@plundra: Bueno, ISO-8859-1 es un superconjunto de ASCII, pero estás en lo cierto: es una codificación diferente. – Piskvor
@Piskvor: Y si uno fuera a usar el 'charset' de arriba con s.decode() por ejemplo, las cosas se romperán (con las páginas enviando iso-8859-1 y confiando en implícito) – plundra