2016-08-06 32 views
0

Ich möchte mein erstes Projekt in Python machen, aber ich habe Probleme mit dem Programmieren. Wenn ich Daten abrufe, werden statt meiner Buchstaben Buchstaben angezeigt, zum Beispiel '\ xc4 \ x87' anstelle von 'ć'. Der Code ist unten:URL holen und in UTF-8 umwandeln Python

Ich weiß, dass der Code hier ist arm, aber ich habe versucht, viele Optionen, um die Codierung zu ändern. Ich habe z = "ł" geschrieben, um zu prüfen, ob es irgendeinen "speziellen" Buchstaben drucken kann und es zeigt. Ich habe versucht, es zu verschlüsseln und es funktioniert auch so, wie es sollte. Sys.stdin.encoding zeigt cp852.

Antwort

0

Die Daten, die Sie von einer urlopen() Antwort lesen, sind codierte Daten. Sie müssten zuerst diese Daten mit der richtigen Codierung decodieren.

Sie scheinen UTF-8-Daten heruntergeladen zu haben. Sie müssten zuerst, dass die Daten entschlüsseln, bevor Sie Text hatte:

test = page.read().decode('utf8') 
jedoch

, es bis zu dem Server ist, Ihnen zu sagen, welche Daten empfangen wurde. Suchen nach einem Zeichensatz in den Headern:

encoding = page.info().getparam('charset') 

Dies kann immer noch None sein; Viele Datenformate enthalten die Codierung als Teil des Formats. XML ist zum Beispiel standardmäßig UTF-8, aber die XML-Deklaration am Anfang kann Informationen darüber enthalten, welcher Codec für dieses Dokument verwendet wurde. Ein XML-Parser würde diese Informationen extrahieren, um sicherzustellen, dass Sie beim Parsen korrekt dekodierten Unicode-Text erhalten.

Sie sind möglicherweise nicht in der Lage, diese Daten zu drucken; Die Codepage 852 kann nur 256 verschiedene Codepunkte verarbeiten, während der Unicode-Standard weitaus größer ist.

0

Die urlopen gibt Ihnen eine Bytes Objekt zurück. Das bedeutet, dass es sich um einen rohen, codierten Bytestrom handelt. Python 3 druckt das in einem Format repr, das Escape-Codes für Nicht-ASCII-Zeichen verwendet. Um den kanonischen Unicode zu erhalten, müssten Sie ihn entschlüsseln. Der richtige Weg, dies zu tun wäre, den Header zu überprüfen und nach der Encoding-Deklaration zu suchen. Aber dafür können wir UTF-8 und Sie können einfach entschlüsseln es als solches, nicht codieren.

Jetzt Python 3 standardmäßig UTF-8-Quellcodierung. Sie können also Nicht-ASCII einbetten, wenn Ihr Editor Unicode unterstützt und als UTF-8 speichert.

z = "ł" 
print(z) 

Drucken wird nur funktionieren, wenn Ihr Terminal UTF-8-Codierung unterstützt. Auf Linux und OSX machen sie das, also ist das dort kein Problem.

+0

Vielen Dank für Ihre Hilfe. Es sieht so einfach aus und ich bin verwirrt. Ich habe etwas Similliar versucht und es hat nicht funktioniert. Ich bin ein Neuling, wie ich gesagt habe. –

+0

Unicode ist schwierig, sogar in Python3. Wenn Sie anfangen, können Sie mit dem Kopieren von Code umgehen, aber wenn Sie ein ernsthaftes Verständnis davon bekommen wollen, sollten Sie sich Ned Batchelders "Pragmatischer Unicode" ansehen, oder, Wie kann ich den Schmerz stoppen? " https://www.youtube.com/watch?v=sgHbC6udIqc. Es hat mir wirklich geholfen. – JonathanZ

0

Die anderen sind korrekt, aber ich möchte eine einfachere Lösung anbieten. Verwenden Sie requests. Es ist der 3. Partei, so dass Sie es über pip installieren müssen:

pip install requests 

Aber es ist viel einfacher als die urllib Bibliotheken zu verwenden.Für Ihren speziellen Fall übernimmt es die Decodierung für Sie aus dem Kasten heraus:

import requests 
r = requests.get("http://olx.pl/") 
print(r.encoding) 
print(type(r.text)) 
print(r.text) 

Aufteilung:

  • get eine HTTP GET Anfrage an den Server sendet und gibt die respose.
  • Wir print die Codierung requests denkt, der Text ist in. Es wählt dies auf der Grundlage der Antwort Header Martijin erwähnt.
  • Wir zeigen, dass r.text ist bereits ein Texttyp decodiert (unicode in Python 2 und str in Python 3)
  • Dann print wir tatsächlich die Antwort.

Beachten Sie, dass wir nicht -print die Codierung oder Typ haben; Ich habe es gerade für diagnostische Zwecke getan, um zu zeigen, was requests tut. requests wurde entwickelt, um viele andere Details der Arbeit mit HTTP-Anfragen zu vereinfachen, und es macht einen guten Job.