Question

Je dois stocker le contenu d'un site qui peut être dans n'importe quelle langue. Et je dois pouvoir rechercher dans le contenu une chaîne Unicode.

J'ai essayé quelque chose comme:

import urllib2

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

Le contenu est un flux d'octets. Je peux donc y rechercher une chaîne Unicode.

J'ai besoin d'un moyen que lorsque je le fais urlopen puis que je lis d'utiliser le jeu de caractères des en-têtes pour décoder le contenu et le coder en UTF-8.

Était-ce utile?

La solution

Après les opérations que vous avez effectuées, vous verrez:

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

et ainsi:

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

ucontent est maintenant une chaîne Unicode (140655 caractères) - par exemple, pour en afficher une partie, si votre terminal est au format UTF-8:

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

et vous pouvez rechercher, etc., etc.

Modifier: les E / S Unicode sont généralement difficiles (c’est peut-être ce qui empêche le demandeur initial), mais je vais éviter le problème difficile de la saisie de chaînes Unicode dans un interpréteur Python interactif (totalement sans rapport avec la question initiale) pour montrer comment, une fois qu'une chaîne Unicode EST entrée correctement (je le fais par points de code - goofy mais pas compliqué ;-), la recherche est absolument une évidence (et espérons donc que la question initiale a été complètement répondue). Supposons à nouveau 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

Remarque : gardez à l'esprit que cette méthode peut ne pas fonctionner pour tous les sites, car certains sites ne spécifient que le codage des caractères dans les documents servis (à l'aide de balises méta http-equiv, par exemple).

Autres conseils

Pour analyser Content-Type l'en-tête http, vous pouvez utiliser la cgi.parse_header fonction:

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)

Une autre façon d'obtenir le jeu de caractères:

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

Ou en Python 3:

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

Le codage de caractères peut également être spécifié dans un document HTML, par exemple, <meta charset="utf-8">.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top