2016-11-03 7 views
2
# -*- coding: utf-8 -*- 

import urllib.request as request 

import re 

url = "http://jjo.kr/users/38281748" 

raw_data = request.urlopen(url).read() #Bytes 

decoded = raw_data.decode("utf-8") 

print(decoded) 

kodiert, ich habe versucht, HTML Informationen über diese URL zu bekommen, aber ich habe Fehlermeldungen.Python 3.x über

UnicodeEncodeError: 'cp949' codec can't encode character '\ufeff' in position 2313: illegal multibyte sequence

Am ich Missverständnis das fuction decode()?

Nach der Python 3.5.2 Standard Library dekodieren "Return eine Zeichenfolge aus den gegebenen Bytes decodiert.".

Aber ich habe CP949 anstelle einer UTF-8-Zeichenfolge.

Kann mir jemand sagen, was mit meinem Code nicht stimmt?

+1

Aus welcher Zeile kommt die Ausnahme? Ich nehme an, es ist vom Druck, der versucht, zu cp949 zu konvertieren, um mit Ihrem Terminal zu arbeiten? – RemcoGerlich

Antwort

0

Sie haben eine Unicode-Zeichenfolge, indem Sie die Byte-Zeichenfolge dekodieren.

Aber wie Sie versuchen, es zu drucken, Python Verwendung cp949 Codierung (weil es Ihre stdout Codierung ist = sys.stdout.encoding)

Es gibt \ufeff (ZERO WIDTH NO-BREAK SPACE), die nicht in CP949 Codierung dargestellt werden kann.

>>> import unicodedata 
>>> unicodedata.name('\ufeff') 
'ZERO WIDTH NO-BREAK SPACE' 

Sie können solche Zeichen durch Codierung mit ignore, replace Fehler-Handler ignorieren/ersetzen.

import sys 

decoded = raw_data.decode("utf-8") 
decoded = decoded.encode(sys.stdout.encoding, 'ignore').decode(sys.stdout.encoding) 
print(decoded) 
+1

Das ist richtig, außer, warum zuerst in die Kodierung von stdout kodieren und dann wieder dekodieren? – RemcoGerlich

+0

OMG es funktioniert tatsächlich! Du musst Genie sein. Danke für die Lösung meines Problems. –

+0

@RemcoGerlich, Sie müssen mit der Kodierung von stdout kodieren (die verwendet wird, wenn Sie (..) 'drucken). Andernfalls wird 'UnicodeEncodeError' ausgelöst, wie OP es hat. Ohne Decodierung, vor allem in Python 3, wird es unerwünschte "b" ... "drucken" (Python 3.x Darstellung von Bytes-Objekt) – falsetru

1

Die decodierte Zeichenfolge enthält ein \uFEFF Zeichen, das eine Byte-Reihenfolge-Markierung ist. Ich habe keine Ahnung, warum es in der Mitte der Seite auftritt, aber die Codierung funktioniert nicht.

Entfernen Sie es mit:

decoded = decoded.replace('\ufeff', '') 

Und es wird wahrscheinlich funktionieren.

+0

vielen dank! aber ich denke, dass \ u003e nicht die einzige ist, die einen Fehler verursacht. –

+0

@JakSa: leider kann ich das nicht testen, weil ich die cp949-Codierung nicht installiert habe. falsetrus Antwort ist allgemeiner. – RemcoGerlich

+0

'u '\ uff'! = B '\ xfeff'' – falsetru