web-dev-qa-db-fra.com

UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ u2026'

J'apprends urllib2 et Beautiful Soup et lors des premiers tests, je reçois des erreurs comme:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 10: ordinal not in range(128)

Il semble y avoir beaucoup de messages sur ce type d'erreur et j'ai essayé les solutions que je peux comprendre, mais il semble y avoir des problèmes avec eux, par exemple:

Je veux imprimer post.text (Où le texte est une belle méthode de soupe qui renvoie simplement le texte). str(post.text) et post.text produisent les erreurs unicode (sur des choses comme ' et ... de l'apostrophe droite).

J'ajoute donc post = unicode(post) au-dessus de str(post.text), puis j'obtiens:

AttributeError: 'unicode' object has no attribute 'text'

J'ai également essayé (post.text).encode() Et (post.text).renderContents(). Ce dernier produisant l'erreur:

AttributeError: 'unicode' object has no attribute 'renderContents'

puis j'ai essayé str(post.text).renderContents() et j'ai eu l'erreur:

AttributeError: 'str' object has no attribute 'renderContents'

Ce serait bien si je pouvais simplement définir quelque part en haut du document 'make this content 'interpretable'' Et avoir toujours accès à la fonction text requise.


Mise à jour: après suggestions:

Si j'ajoute post = post.decode("utf-8") ci-dessus str(post.text) j'obtiens:

TypeError: unsupported operand type(s) for -: 'str' and 'int'  

Si j'ajoute post = post.decode() ci-dessus str(post.text) j'obtiens:

AttributeError: 'unicode' object has no attribute 'text'

Si j'ajoute post = post.encode("utf-8") au-dessus de (post.text) J'obtiens:

AttributeError: 'str' object has no attribute 'text'

J'ai essayé print post.text.encode('utf-8') et obtenu:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 39: ordinal not in range(128)

Et pour essayer des choses qui pourraient fonctionner, j'ai installé lxml pour Windows à partir de ici et l'ai implémenté avec:

parsed_content = BeautifulSoup(original_content, "lxml")

selon http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters .

Ces étapes ne semblaient pas faire de différence.

J'utilise Python 2.7.4 et Beautiful Soup 4.


Solution:

Après avoir acquis une compréhension plus approfondie des types Unicode, utf-8 et Beautiful Soup, cela avait quelque chose à voir avec ma méthodologie d'impression. J'ai supprimé toutes mes str méthodes et concaténations, par exemple str(something) + post.text + str(something_else), de sorte que c'était something, post.text, something_else et il semble bien imprimer sauf que j'ai moins de contrôle sur le formatage à ce stade (par exemple les espaces insérés à ,).

28
user1063287

Dans Python 2, unicode les objets ne peuvent être imprimés que s'ils peuvent être convertis en ASCII. S'il ne peut pas être encodé en ASCII, vous obtiendrez cette erreur. Vous voulez probablement le coder explicitement, puis imprimer le str résultant:

print post.text.encode('utf-8')
45
icktoofay
    html = urllib.request.urlopen(THE_URL).read()
    soup = BeautifulSoup(html)
    print("'" + str(soup.encode("ascii")) + "'")

travaillé pour moi ;-)

2
Patpog

Avez-vous essayé .decode() ou .decode("utf-8")?

Et, je recommande d'utiliser lxml en utilisant html5lib parser

http://lxml.de/html5parser.html

0
jeyraof