Frage

Ich versuche, große Zeichenfolgen zufälligen HTML-Codes durch reguläre Ausdrücke zu übergeben, und mein Python 2.6-Skript verschluckt sich daran:

UnicodeEncodeError:Der Codec „ASCII“ kann Zeichen nicht kodieren

Ich habe es auf eine hochgestellte Marke am Ende dieses Wortes zurückgeführt:Protection™ – und ich gehe davon aus, dass ich in Zukunft noch andere dieser Art treffen werde.

Gibt es ein Modul zur Verarbeitung von Nicht-ASCII-Zeichen?oder wie kann man in Python am besten mit Nicht-ASCII-Inhalten umgehen bzw. diese umgehen?

Danke!Vollständiger Fehler:

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)

Vollständiges Skript:

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()
War es hilfreich?

Lösung

Sie versuchen, einen Bytestring an etwas zu übergeben, aber das lässt sich (aufgrund der Knappheit der von Ihnen bereitgestellten Informationen) nicht sagen Was Du versuchst es weiterzugeben.Sie beginnen mit einer Unicode-Zeichenfolge, die nicht als ASCII (der Standardcodec) codiert werden kann. Sie müssen also mit einem anderen Codec codieren (oder ihn transkribieren, wie @R.Pate vorschlägt) – dies ist jedoch nicht möglich sagen Was Codec, den Sie verwenden sollten, da wir nicht wissen, was Sie als Bytestring übergeben, und daher nicht wissen, was dieses unbekannte Subsystem in Bezug auf Codecs akzeptieren und korrekt verarbeiten kann.

In solch völliger Dunkelheit, in der du uns zurücklässt, utf-8 ist eine vernünftige blinde Vermutung (da es sich um einen Codec handelt, der jede Unicode-Zeichenfolge genau als Bytestring darstellen kann, und es sich um den Standardcodec für viele Zwecke handelt, beispielsweise für XML) – mehr als eine blinde Vermutung kann es jedoch nicht sein, bis und es sei denn, Sie erzählen uns mehr darüber Was Sie versuchen, diesen Bytestring zu übergeben, und für welche Zwecke.

Vorbeigehen thestring.encode('utf-8') statt nackt thestring wird auf jeden Fall den speziellen Fehler vermeiden, den Sie gerade sehen, aber es kann zu eigenartigen Anzeigen (oder was auch immer) führen Ist Sie versuchen, mit diesem Bytestring etwas anzufangen!, es sei denn, der Empfänger ist bereit, willens und in der Lage, die UTF-8-Kodierung zu akzeptieren (und wie könnten WIR das wissen, da wir absolut keine Ahnung haben, was der Empfänger möglicherweise sein könnte?!-)

Andere Tipps

Sie versuchen Unicode umwandeln in "streng" -Modus ascii:

>>> 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.

Sie möchten wahrscheinlich so etwas wie eine der folgenden Möglichkeiten:

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

Der „beste“ Weg ist immer abhängig von Ihren Anforderungen; ja, was ist Ihre? Ignoriert Nicht-ASCII angemessen? Sollten Sie ™ mit "(tm)" ersetzen? (Welche sieht für dieses Beispiel Besonderes, aber schnell bricht für andere Codepunkte, aber es kann nur sein, was Sie wollen.) Könnte die Ausnahme genau das, was Sie brauchen; Jetzt müssen Sie nur es in irgendeiner Art und Weise behandeln?

Nur kann man wirklich diese Frage beantworten.

Zunächst einmal versuchen, Übersetzungen für die englische Sprache (oder eine andere, wenn erforderlich) installieren:

sudo apt-get install language-pack-en

, die Übersetzungsdaten-Updates für alle unterstützten Pakete (einschließlich Python) zur Verfügung stellt.

Und stellen Sie sicher, dass Sie die richtige Codierung in Ihrem Code verwenden.

Zum Beispiel:

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

verdoppeln Dann Systemkonfiguration überprüfen wie Wert von LANG oder Konfiguration von locale (/etc/default/locale) und vergessen Sie nicht Ihre Sitzung erneut anmelden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top