9 Stimmen

UnicodeEncodeError beim Abrufen der URL

Ich habe dieses Problem versuchen, alle Textknoten in einem HTML-Dokument mit lxml zu erhalten, aber ich bekomme ein UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128) . Wenn ich jedoch versuche, die Art der Kodierung dieser Seite herauszufinden ( encoding = chardet.detect(response)['encoding'] ), heißt es, es sei utf-8 . Es scheint seltsam, dass eine einzige Seite utf-8 und ascii hat. Eigentlich ist das:

fromstring(response).text_content().encode('ascii', 'replace')

löst das Problem.

Hier ist mein Code:

from lxml.html import fromstring
import urllib2
import chardet
request = urllib2.Request(my_url)
request.add_header('User-Agent',
                   'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)')   
request.add_header("Accept-Language", "en-us")
response = urllib2.urlopen(request).read()

print encoding
print fromstring(response).text_content()

Sortie :

utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)

Was kann ich tun, um dieses Problem zu lösen? Denken Sie daran, dass ich dies mit ein paar anderen Seiten tun wollen, so dass ich nicht auf individueller Basis zu kodieren wollen.

UPDATE :

Vielleicht geht es hier um etwas anderes. Wenn ich dieses Skript auf dem Terminal ausführe, erhalte ich eine korrekte Ausgabe, aber wenn ich es in SublimeText ausführe, erhalte ich UnicodeEncodeError... ¿?

UPDATE2:

Das Problem tritt auch auf, wenn ich eine Datei mit dieser Ausgabe erstelle. .encode('ascii', 'replace') funktioniert, aber ich hätte gerne eine allgemeinere Lösung.

Mit freundlichen Grüßen

5voto

ChipJust Punkte 1368

Können Sie versuchen, Ihre Zeichenkette mit repr() zu umschließen? Dieser Artikel könnte helfen.

print repr(fromstring(response).text_content())

3voto

Justin.Wood Punkte 685

Was das Schreiben in eine Datei anbelangt, würde ich empfehlen, die Datei mit dem Codecs-Modul zu öffnen:

import codecs
output_file = codecs.open('filename.txt','w','utf8')

Ich kenne SublimeText nicht, aber es scheint zu versuchen, Ihre Ausgabe als ASCII zu lesen, daher der Kodierungsfehler.

0voto

Marco de Wit Punkte 2588

Ausgehend von Ihrer ersten Aktualisierung würde ich sagen, dass das Terminal Python angewiesen hat, utf-8 auszugeben, und SublimeText deutlich gemacht hat, dass es ascii erwartet. Ich denke also, dass die Lösung darin liegt, die richtigen Einstellungen in SublimeText zu finden.

Wenn Sie jedoch nicht ändern können, was SublimeText erwartet, ist es besser, die encode Funktion, wie Sie es bereits in einer separaten Funktion getan haben.

def smartprint( text ) :
    if sys.stdout.encoding == None :
        print text
    else :
        print text.encode( sys.stdout.encoding , 'replace' )

Sie können diese Funktion anstelle von print . Beachten Sie, dass sich die Ausgabe Ihres Programms in SublimeText von der in Terminal unterscheidet. Wegen der replace akzentuierte Zeichen verlieren ihre Akzente, wenn dieser Code in SublimeText ausgeführt wird, z. B. é wird angezeigt als e .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X