46 votes

urllib2 lu en Unicode

J'ai besoin de 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 le rechercher pour une chaîne Unicode.

J'ai besoin de quelque manière que lorsque je fais urlopen et que je lise ensuite pour utiliser le jeu de caractères des en-têtes pour décoder le contenu et le coder en UTF-8.

99voto

Alex Martelli Points 330805

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

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

et donc:

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

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

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

et vous pouvez faire des recherches, etc, etc.

Edit: Unicode I/O est généralement difficile (cela peut être ce qu'est maintenant l'originale asker) mais je vais contourner le problème difficile de la saisie de chaînes Unicode interactif de l'interpréteur Python (sans aucun rapport avec la question d'origine) pour montrer comment, à partir d'une chaîne Unicode EST correctement entrée (je suis en train de faire par codepoints -- goofy, mais pas difficile;-), la recherche est absolument pas sorcier (et donc j'espère que la question initiale a été soigneusement répondu). En supposant encore une fois UTF-8 d'un terminal:

>>> 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écifier le codage des caractères à l'intérieur de la signification de documents (à l'aide de http-equiv meta balises, par exemple).

10voto

J.F. Sebastian Points 102961

Pour analyser l'en-tête Content-Type http, vous pouvez utiliser la fonction 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)
 

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X