Pregunta

Necesito almacenar el contenido de un sitio que puede estar en cualquier idioma.Y necesito poder buscar en el contenido una cadena Unicode.

He probado algo como:

import urllib2

req = urllib2.urlopen('http://lenta.ru')
content = req.read()

El contenido es un flujo de bytes, por lo que puedo buscar una cadena Unicode.

Necesito alguna manera de que cuando lo haga urlopen y luego lea para usar el juego de caracteres de los encabezados para decodificar el contenido y codificarlo en UTF-8.

¿Fue útil?

Solución

Después de las operaciones que realizó, verá:

>>> req.headers['content-type']
'text/html; charset=windows-1251'

y así:

>>> encoding=req.headers['content-type'].split('charset=')[-1]
>>> ucontent = unicode(content, encoding)

ucontent ahora es una cadena Unicode (de 140655 caracteres), por ejemplo, para mostrar una parte de ella, si su terminal es UTF-8:

>>> print ucontent[76:110].encode('utf-8')
<title>Lenta.ru: Главное: </title>

y puedes buscar, etc., etc.

Editar: Unicode I / O suele ser complicado (esto puede ser lo que está reteniendo al autor de la pregunta original) pero voy a evitar el difícil problema de ingresar cadenas Unicode a un intérprete interactivo de Python (completamente ajeno a la pregunta original) para mostrar cómo, una vez que se ingresa correctamente una cadena Unicode (lo estoy haciendo por puntos de código, tonto pero no complicado ;-), la búsqueda es absolutamente obvia (y, por lo tanto, espero que la pregunta original haya sido completamente respondida). Nuevamente asumiendo un terminal UTF-8:

>>> x=u'\u0413\u043b\u0430\u0432\u043d\u043e\u0435'
>>> print x.encode('utf-8')
Главное
>>> x in ucontent
True
>>> ucontent.find(x)
93

Nota : tenga en cuenta que este método puede no funcionar para todos los sitios, ya que algunos sitios solo especifican la codificación de caracteres dentro de los documentos servidos (usando metaetiquetas http-equiv, por ejemplo).

Otros consejos

Para analizar el Content-Type encabezado http, puede usar la función cgi.parse_header:

import cgi
import urllib2

r = urllib2.urlopen('http://lenta.ru')
_, params = cgi.parse_header(r.headers.get('Content-Type', ''))
encoding = params.get('charset', 'utf-8')
unicode_text = r.read().decode(encoding)

Otra forma de obtener el juego de caracteres:

>>> import urllib2
>>> r = urllib2.urlopen('http://lenta.ru')
>>> r.headers.getparam('charset')
'utf-8'

O en Python 3:

>>> import urllib.request
>>> r = urllib.request.urlopen('http://lenta.ru')
>>> r.headers.get_content_charset()
'utf-8'

La codificación de caracteres también se puede especificar dentro del documento html, por ejemplo, <meta charset="utf-8">.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top