2009-07-09 9 views
0

Je vais chercher une page Web (http://autoweek.com) et en essayant de le traiter, mais obtenir une erreur d'encodage. Autoweek déclare "iso-8859-1" encoding et a le mot "Nurburgring" (u avec tréma)Unicode problème Django-Python-URLLIB-MySQL

je:

# -*- encoding: utf-8 -*- 
import urllib 
webpage = urllib.urlopen(feed.crawl_url).read() 
webpage.decode("utf-8") 

il me donne l'erreur suivante:

'utf8' codec can't decode bytes in position 7768-7773: unsupported Unicode code range" 

si je contourner la phase de .decode et effectue une analyse avec la bibliothèque lxml, il déclenche une erreur quand je gardais titre analysable à la base de données:

'utf8' codec can't decode bytes in position 45-50: unsupported Unicode code range 

Ma base de données a le jeu de caractères UTF8 et le classement général utf-ci

Mes paramètres:
Django
Python
MySQL 2.4.3 5.0.22
MySQL-python 1.2.1
mod_python 3.2.8

Répondre

0

autoweek.com semble confus à propos de son propre codage. Il déclare définitions charset contradictoires:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

et plus tard ...

<meta charset=iso-8859-1"/>. 

iso-8859-1 est le bon car cela est retourné dans l'en-tête du serveur Web et par la méthode .info() (et il décode réellement), mais cela démontre que vous ne pouvez pas nécessairement compter sur la déclaration Content-Type dans les pages Web. Vous devriez suivre la méthode décrite par Lavinio.

3

Si le webpage déclare l'encodage iso-8859-1, ne pouvez-vous pas faire webpage.decode("iso-8859-1")?

À ce stade, webpage est décodé pour votre application. Lorsqu'il est écrit dans la base de données, le mappage doit gérer le codage char-to-utf8. Pour obtenir le codage correct, dites au serveur web que vous n'acceptez que UTF-8, et c'est ce que vous obtiendrez (espérons-le) toujours, car tout le monde lit UTF-8 (ou vous pouvez essayer avec ISO-8859-1); ou utilisez .info pour inspecter le nom de codage du flux renvoyé. Pour plus de détails, voir urllib2 - The Missing Manual et Quick reference to HTTP headers pour plus de détails.

+0

J'ai besoin de sérialiser cette solution pour toutes les pages (de codages différents) que je cherche. Je dois donc aller chercher, extraire l'encodage (si c'est déclaré) et ensuite décoder. Une solution plus facile? –

+1

Non. C'est la seule solution, sauf si vous voulez jeter les caractères incorrects. Et ce n'est honnêtement pas très compliqué. –

+0

+1 vous devez décoder en utilisant iso-8859-1. J'ai vérifié cela par rapport à votre URL et cela fonctionne très bien. – mhawke