1396 votes

UnicodeEncodeError : ' ascii ' codec peut ' t coder caractères u ' \xa0 ' en position 20 : ordinal pas dans range(128)

Je vais avoir des problèmes avec les caractères unicode à partir du texte récupérée à partir de différentes pages web sur des sites différents). Je suis à l'aide de BeautifulSoup.

Le problème est que l'erreur n'est pas toujours reproduit en qui il travaille parfois avec certaines pages, et parfois, il barfs en jetant un UnicodeEncodeError. J'ai essayé à peu près tout ce que je pense, et je n'ai pas encore trouvé quelque chose qui fonctionne toujours sans jeter un certain type de format Unicode d'erreur lié.

L'une des sections de code qui est à l'origine des problèmes est indiquée ci-dessous:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

Voici une trace de la pile de produit sur CERTAINES chaînes lorsque l'extrait ci-dessus est exécuté:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

Je soupçonne que c'est parce que certaines pages (ou plus précisément, les pages de certains sites) peuvent être codés, tandis que d'autres peuvent être non codée. Tous les sites sont basés au royaume-UNI et de fournir des données signifiait pour le royaume-UNI de la consommation - donc, il n'y a pas de questions relatives à l'internalisation ou de traiter avec le texte écrit dans autre chose que l'anglais.

Quelqu'un a une idée de comment résoudre ce problème afin que je puisse CONSITENTLY résoudre ce problème?

1454voto

agf Points 45052

Vous avez besoin de lire le Python Unicode HOWTO. Cette erreur est le premier exemple.

En gros, arrêtez d'utiliser str pour convertir du format unicode au format texte codé / octets.

Au lieu de cela, utiliser correctement .encode() pour encoder la chaîne:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

ou de travailler entièrement dans unicode.

461voto

Andbdrew Points 4340

C'est un classique python unicode point douloureux! Considérez les points suivants:

a = u'bats\u00E0'
print a
 => batsà

Tout bon jusqu'ici, mais si nous appelons str(a), nous allons voir ce qui se passe:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

Oh dip, qui ne va pas faire de bien à personne! Pour corriger l'erreur, de coder les octets explicitement .encoder et de dire à python quel codec utiliser:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil\u00E0!

Le problème est que lorsque vous appelez str(), python utilise le codage de caractères par défaut pour essayer de le coder les octets que vous avez donné, ce qui, dans votre cas, sont parfois, les représentations de caractères unicode. Pour résoudre le problème, vous devez indiquer à python la façon de traiter avec la chaîne que vous donnez à l'aide de .encode('whatever_unicode'). La plupart du temps, vous devriez être bien en utf-8.

Pour un excellent exposé sur ce sujet, voir Ned Batchelder de PyCon parler ici: http://nedbatchelder.com/text/unipain.html

232voto

Max Korolevsky Points 41

J’ai trouvé le travail élégant autour de moi enlever les symboles et continuer à maintenir la chaîne comme chaîne en suit :

97voto

maxpolk Points 488

Un problème subtil provoquant même impression d’échouer est d’avoir vos variables d’environnement définies erronés, par exemple. LC_ALL définis ici « C ». Dans Debian, ils découragent mise en : wiki Debian sur les paramètres régionaux

27voto

Phil LaNasa Points 510

J’ai effectivement trouvé que dans la plupart de mon cas, juste dépouiller ces caractères est beaucoup plus simple :

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