Question

J'essaie de passer de grosses chaînes de code HTML aléatoire au travers d'expressions régulières et mon script Python 2.6 s'étouffe:

UnicodeEncodeError: le codec 'ascii' ne peut pas coder de caractère

Je l'ai remonté jusqu'à un indice supérieur à la fin de ce mot: Protection ™ - et je m'attends à en rencontrer d'autres à l'avenir.

Existe-t-il un module permettant de traiter les caractères non ascii? ou, quel est le meilleur moyen de gérer / d’évader les éléments non-ASCII en python?

Merci! Erreur complète:

E
======================================================================
ERROR: test_untitled (__main__.Untitled)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\Test2.py", line 26, in test_untitled
    ofile.write(Whois + '\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 1005: ordinal not in range(128)

Script complet:

from selenium import selenium
import unittest, time, re, csv, logging

class Untitled(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox", "http://www.BaseDomain.com/")
        self.selenium.start()
        self.selenium.set_timeout("90000")

    def test_untitled(self):
        sel = self.selenium
        spamReader = csv.reader(open('SubDomainList.csv', 'rb'))
        for row in spamReader:
            sel.open(row[0])
            time.sleep(10)
            Test = sel.get_text("//html/body/div/table/tbody/tr/td/form/div/table/tbody/tr[7]/td")
            Test = Test.replace(",","")
            Test = Test.replace("\n", "")
            ofile = open('TestOut.csv', 'ab')
            ofile.write(Test + '\n')
            ofile.close()

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()
Était-ce utile?

La solution

Vous essayez de passer d'un mot à un autre, mais il est impossible (compte tenu de la rareté des informations que vous fournissez) de dire à quoi vous essayez de le transmettre. Vous commencez avec une chaîne Unicode qui ne peut pas être encodée en ASCII (le codec par défaut), vous devrez donc encoder avec un codec différent (ou le translittérer, comme le suggère @ R.Pate) - mais il est impossible de l'utiliser. Dites quel codec vous devriez utiliser, car nous ne savons pas ce que vous transmettez à la chaîne d'octets et, par conséquent, nous ne savons pas ce que ce sous-système inconnu va être en mesure d'accepter et de traiter correctement en termes de codecs.

Dans l'obscurité totale où vous nous laissez entrer, utf-8 est une supposition aveugle raisonnable (puisqu'il s'agit d'un codec pouvant représenter n'importe quelle chaîne Unicode exactement comme une chaîne d'octets, et qu'il s'agit du codec standard beaucoup d’usages, tels que XML) - mais il ne peut s’agir que d’une conjecture aveugle, tant que vous n’allez pas nous en dire plus sur ce que vous essayez de surmonter. et à quelles fins.

Passer thestring.encode ('utf-8') plutôt que nu thestring évitera définitivement l'erreur particulière que vous voyez actuellement, mais cela peut entraîner des affichages particuliers (ou ce que vous faites vous essayez de faire avec ce bytestring!) à moins que le destinataire ne soit prêt, disposé et capable d'accepter le codage utf-8 (et comment pourrions-nous le savoir, n'ayant absolument rien idée de ce que le destinataire pourrait être?! -)

Autres conseils

Vous essayez de convertir unicode en ascii en "strict". mode:

>>> help(str.encode)
Help on method_descriptor:

encode(...)
    S.encode([encoding[,errors]]) -> object

    Encodes S using the codec registered for encoding. encoding defaults
    to the default encoding. errors may be given to set a different error
    handling scheme. Default is 'strict' meaning that encoding errors raise
    a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
    'xmlcharrefreplace' as well as any other name registered with
    codecs.register_error that is able to handle UnicodeEncodeErrors.

Vous voulez probablement quelque chose comme l’un des suivants:

s = u'Protection™'

print s.encode('ascii', 'ignore')    # removes the ™
print s.encode('ascii', 'replace')   # replaces with ?
print s.encode('ascii','xmlcharrefreplace') # turn into xml entities
print s.encode('ascii', 'strict')    # throw UnicodeEncodeErrors

Le "meilleur" manière dépend toujours de vos besoins; alors, quels sont les vôtres? Ignorer les non-ASCII est-il approprié? Devez-vous remplacer & # 8482; avec "(tm)" (Cela peut sembler raffiné pour cet exemple, mais disparaît rapidement pour les autres points de code & # 8212; mais c'est peut-être ce que vous voulez.) L'exception pourrait-elle être exactement ce dont vous avez besoin; Maintenant, vous avez juste besoin de le gérer d’une manière ou d’une autre?

Vous seul pouvez vraiment répondre à cette question.

Tout d'abord, essayez d'installer des traductions pour l'anglais (ou toute autre langue si nécessaire):

sudo apt-get install language-pack-en

qui fournit des mises à jour des données de traduction pour tous les packages pris en charge (y compris Python).

Et assurez-vous d’utiliser le bon encodage dans votre code.

Par exemple:

open(foo, encoding='utf-8')

Vérifiez ensuite la configuration de votre système comme la valeur de LANG ou la configuration de l'environnement local ( / etc / default / locale ) et n'oubliez pas de vous reconnecter à votre session. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top