J'ai des problèmes avec les caractères unicode du texte récupéré à partir de différentes pages Web (sur différents sites). J'utilise BeautifulSoup.
Le problème est que l'erreur n'est pas toujours reproductible; il fonctionne parfois avec certaines pages, et parfois, il abat en lançant a UnicodeEncodeError
. J'ai essayé à peu près tout ce à quoi je peux penser, et pourtant je n'ai rien trouvé qui fonctionne de manière cohérente sans lancer une sorte d'erreur liée à Unicode.
L'une des sections de code qui pose problème est illustré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 pile produite 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 cela est dû au fait que certaines pages (ou plus précisément, les pages de certains sites) peuvent être codées, tandis que d'autres peuvent ne pas l'être. Tous les sites sont basés au Royaume-Uni et fournissent des données destinées à la consommation au Royaume-Uni - il n'y a donc aucun problème lié à l'internalisation ou au traitement de texte écrit en autre chose qu'en anglais.
Quelqu'un at-il des idées sur la façon de résoudre ce problème afin que je puisse résoudre ce problème de manière cohérente?
la source
import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore'))
.$ export PYTHONIOENCODING=utf8
Réponses:
Vous devez lire le HOWTO Python Unicode . Cette erreur est le tout premier exemple .
Fondamentalement, arrêtez d'utiliser
str
pour convertir unicode en texte / octets codés.À la place, utilisez correctement
.encode()
pour encoder la chaîne:ou travailler entièrement en unicode.
la source
print
mes cordes utf-8, cela fonctionne bien. Cependant, lorsque je redirige la sortie de mes programmes vers un fichier, il renvoie aUnicodeEncodeError
. En fait, lorsque la sortie est redirigée (vers un fichier ou un tube), je trouve quesys.stdout.encoding
c'est le casNone
! Le virement.encode('utf-8')
résout le problème.PYTHONIOENCODING=utf-8
plutôt ie, imprimez les chaînes Unicode et laissez l'environnement définir le codage attendu..encode()
méthode à appeler.C'est un point de douleur unicode classique en python! Considérer ce qui suit:
Tout va bien jusqu'à présent, mais si nous appelons str (a), voyons ce qui se passe:
Oh trempette, ça ne fera de bien à personne! Pour corriger l'erreur, codez les octets explicitement avec .encode et dites à python quel codec utiliser:
Voil \ u00E0!
Le problème est que lorsque vous appelez str (), python utilise le codage de caractères par défaut pour essayer de coder les octets que vous lui avez donnés, qui dans votre cas sont parfois des représentations de caractères unicode. Pour résoudre le problème, vous devez dire à python comment gérer la chaîne que vous lui donnez en utilisant .encode ('any_unicode'). La plupart du temps, vous devriez bien utiliser utf-8.
Pour une excellente exposition sur ce sujet, voir le discours PyCon de Ned Batchelder ici: http://nedbatchelder.com/text/unipain.html
la source
None
valeur.J'ai trouvé un travail élégant pour supprimer les symboles et continuer à garder la chaîne en tant que chaîne comme suit:
Il est important de noter que l'utilisation de l'option ignorer est dangereuse car elle supprime silencieusement toute prise en charge unicode (et internationalisation) du code qui l'utilise, comme on le voit ici (convertir unicode):
la source
yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
os.path.join()
, c'est une très bonne habitude lorsque vous commencez à faire de la programmation multiplateforme. :)eh bien j'ai tout essayé mais cela n'a pas aidé, après avoir fait des recherches sur Google, j'ai compris ce qui suit et cela a aidé. python 2.7 est en cours d'utilisation.
la source
if sys.version_info.major < 3:
Un problème subtil entraînant l'échec de l'impression est que vos variables d'environnement sont incorrectes, par exemple. ici LC_ALL mis à "C". Dans Debian, ils découragent de le configurer: Debian wiki sur Locale
la source
env|grep -E '(LC|LANG)'
.mc
en mode « sous - shell » (Ctrl-O
) et j'ai aussi oublié que j'ai ajouté l'alias suivant à bash:alias mc="LANG=en_EN.UTF-8 mc"
. Donc, quand j'ai essayé d'exécuter des scripts mal écrits qui dépendent de l'ru_RU.UTF-8
intérieur, ils meurent. J'ai essayé beaucoup de choses de ce fil avant de découvrir le vrai problème. :)Pour moi, ce qui a fonctionné était:
J'espère que cela aide quelqu'un.
la source
J'ai en fait constaté que dans la plupart de mes cas, le simple fait de supprimer ces caractères est beaucoup plus simple:
la source
Le problème est que vous essayez d'imprimer un caractère unicode, mais votre terminal ne le prend pas en charge.
Vous pouvez essayer d'installer le
language-pack-en
package pour résoudre ce problème:qui fournit des mises à jour des données de traduction en anglais pour tous les packages pris en charge (y compris Python). Installez un package de langue différent si nécessaire (selon les caractères que vous essayez d'imprimer).
Sur certaines distributions Linux, il est nécessaire pour s'assurer que les paramètres régionaux anglais par défaut sont correctement configurés (afin que les caractères unicode puissent être gérés par shell / terminal). Parfois, il est plus facile de l'installer que de le configurer manuellement.
Ensuite, lors de l'écriture du code, assurez-vous d'utiliser le bon encodage dans votre code.
Par exemple:
Si vous avez toujours un problème, revérifiez la configuration de votre système, telle que:
Votre fichier de paramètres régionaux (
/etc/default/locale
), qui devrait avoir par exempleou:
Valeur de
LANG
/LC_CTYPE
in shell.Vérifiez les paramètres régionaux pris en charge par votre shell:
Démonstration du problème et de la solution dans une nouvelle machine virtuelle.
Initialiser et provisionner la VM (par exemple en utilisant
vagrant
):Voir: boîtes Ubuntu disponibles . .
Impression de caractères unicode (comme le signe de marque comme
™
):Installation en cours
language-pack-en
:Maintenant, le problème devrait être résolu:
Sinon, essayez la commande suivante:
la source
language-pack-en
à voir avec Python ou cette question? AFAIK, il peut fournir des traductions linguistiques aux messages mais n'a rien à voir avec l'encodage/etc/locale.gen
pour s'assurer que son environnement local est construit avant de l'utiliser?LANG
de/etc/default/locale
(comme/etc/locale.gen
exist de does't) et RANlocale-gen
, mais il n'a pas aidé. Je ne sais paslanguage-pack-en
exactement ce qui se passe, car je n'ai pas trouvé beaucoup de documentation et en lister le contenu n'aide pas beaucoup.LANG
/LC_CTYPE
/ à laLC_ALL
place (par exemple,LANG=C.UTF-8
).En coquille:
Recherchez les paramètres régionaux UTF-8 pris en charge à l'aide de la commande suivante:
Exportez-le avant d'exécuter le script, par exemple:
ou manuellement comme:
Testez-le en imprimant des caractères spéciaux, par exemple
™
:Ci-dessus testé dans Ubuntu.
la source
Ajoutez la ligne ci-dessous au début de votre script (ou comme deuxième ligne):
C'est la définition de l'encodage du code source python. Plus d'informations dans PEP 263 .
la source
Voici un remaniement de quelques autres réponses soi-disant "flic out". Il y a des situations dans lesquelles le simple fait de jeter les caractères / chaînes gênants est une bonne solution, malgré les protestations exprimées ici.
Le tester:
Résultats:
Suggestion: vous pourriez vouloir nommer cette fonction à la
toAscii
place? C'est une question de préférence.Cela a été écrit pour Python 2. Pour Python 3, je pense que vous voudrez utiliser
bytes(obj,"ascii")
plutôt questr(obj)
. Je n'ai pas encore testé cela, mais je vais à un moment donné et réviser la réponse.la source
Je mets toujours le code ci-dessous dans les deux premières lignes des fichiers python:
la source
Fonctions d'assistance simples trouvées ici .
la source
backslashreplace
gestionnaire d'erreur:u'\xa0'.encode('ascii', 'backslashreplace')
. Bien que vous deviez éviter une telle représentation et configurer votre environnement pour accepter des caractères non-ascii à la place - c'est 2016!Ajoutez simplement à un encodage variable ('utf-8')
la source
Veuillez ouvrir le terminal et lancer la commande ci-dessous:
la source
Je viens d'utiliser les éléments suivants:
Vérifiez ce que la documentation en dit:
Le résout pour moi. Simple et facile.
la source
La solution ci-dessous a fonctionné pour moi, vient d'être ajoutée
(représentant la chaîne en unicode) avant ma chaîne.
la source
Hélas, cela fonctionne en Python 3 au moins ...
Python 3
Parfois, l'erreur se trouve dans les variables de l'environnement et se rencontre donc
où les erreurs sont ignorées dans le codage.
la source
Je viens d'avoir ce problème, et Google m'a conduit ici, alors juste pour ajouter aux solutions générales ici, c'est ce qui a fonctionné pour moi:
J'ai eu cette idée après avoir lu la présentation de Ned .
Je ne prétends pas comprendre pleinement pourquoi cela fonctionne, cependant. Donc, si quelqu'un peut modifier cette réponse ou mettre un commentaire pour l'expliquer, je l'apprécierai.
la source
type
valeur? avant et après cela? Je pense que cela fonctionne parce qu'en faisant ununic += value
qui est le même queunic = unic + value
vous ajoutez une chaîne et un unicode, où python assume alors unicode pour la résultante,unic
c'est-à-dire le type le plus précis (pensez quand vous faites celaa = float(1) + int(1)
,a
devient un flottant) etvalue = unic
pointe ensuitevalue
vers le nouvelunic
objet qui se trouve être unicode.Nous avons rencontré cette erreur lors de l'exécution
manage.py migrate
dans Django avec des appareils localisés.Notre source contenait la
# -*- coding: utf-8 -*-
déclaration, MySQL était correctement configuré pour utf8 et Ubuntu avait le pack de langue et les valeurs appropriés dans/etc/default/locale
.Le problème était simplement que le conteneur Django (nous utilisons docker) manquait le
LANG
var env.Réglage
LANG
deen_US.UTF-8
et redémarrer le conteneur avant migrations réexécution résolu le problème.la source
De nombreuses réponses ici (@agf et @Andbdrew par exemple) ont déjà abordé les aspects les plus immédiats de la question OP.
Cependant, je pense qu'il y a un aspect subtil mais important qui a été largement ignoré et qui compte beaucoup pour tous ceux qui comme moi se sont retrouvés ici tout en essayant de donner un sens aux encodages en Python: Python 2 vs Python 3, la gestion de la représentation des personnages est très différente . Je me sens comme un gros morceau de confusion a à voir avec les gens qui lisent sur les encodages en Python sans être au courant de la version.
Je suggère à toute personne intéressée à comprendre la cause première du problème OP de commencer par lire l' introduction de Spolsky aux représentations de caractères et Unicode, puis de passer à Batchelder sur Unicode en Python 2 et Python 3.
la source
Essayez d'éviter la conversion de variable en str (variable). Parfois, cela peut provoquer le problème.
Astuce simple à éviter:
L'exemple ci-dessus résoudra également l'erreur Encode.
la source
Si vous avez quelque chose comme
packet_data = "This is data"
ça, faites-le sur la ligne suivante, juste après l'initialisationpacket_data
:la source
Mise à jour pour python 3.0 et versions ultérieures. Essayez ce qui suit dans l'éditeur python:
Cela définit l'encodage des paramètres régionaux par défaut du système au format UTF-8.
Plus d'informations peuvent être lues ici sur PEP 538 - Contrainte des paramètres régionaux C hérités à des paramètres régionaux basés sur UTF-8 .
la source
J'ai eu ce problème en essayant de sortir des caractères Unicode
stdout
, mais avecsys.stdout.write
, plutôt que d'imprimer (afin que je puisse également prendre en charge la sortie vers un fichier différent).À partir de la propre documentation de BeautifulSoup , j'ai résolu cela avec la bibliothèque de codecs:
la source
Ce problème se produit souvent lorsqu'un projet django se déploie à l'aide d'Apache. Parce qu'Apache définit la variable d'environnement LANG = C dans / etc / sysconfig / httpd. Ouvrez simplement le fichier et commentez (ou modifiez votre version) ce paramètre. Ou utilisez l'option lang de la commande WSGIDaemonProcess, dans ce cas, vous pourrez définir différentes variables d'environnement LANG sur différents hôtes virtuels.
la source
La solution recommandée n'a pas fonctionné pour moi, et je pouvais vivre avec le dumping de tous les caractères non ascii, donc
ce qui m'a laissé quelque chose de dépouillé qui ne jette pas d'erreurs.
la source
Cela fonctionnera:
Production:
la source
Dans le cas général de l'écriture de cette chaîne de codage non prise en charge (disons ) dans un fichier (par exemple ), cela fonctionne
data_that_causes_this_error
results.txt
la source