2012-07-21 10 views
5

Ich habe viel zu lange mit Codierungen gekämpft, und heute möchte ich die mentale Block weit offen brechen.Wie behandelt man Codierungen mit Python Requests Bibliothek

Im Moment benutze ich Requests, um eine Reihe von Websites zu kratzen, und von dem, was ich sagen kann, verwendet die HTTP-Header, um die Codierungen, die die Seiten verwenden, zurück zu chardet, wenn die Website die Header fehlen. Von dort dekodiert er den heruntergeladenen Bytecode und übergibt mir dann hilfreich ein Unicode-Objekt in r.text.

Alles gut.

Aber wo ich bin verwirrt ist, dass es aus ich auf den Text einige Arbeit zu tun und es dann auf die Standardausgabe drucken, eine Codierung bereitstellt, wenn ich drucken:

print foo.encode('utf-8') 

Das Problem ist, dass, wenn ich tun das, was gedruckt wird, ist durcheinander. Im Folgenden erwarte ich eine endash zwischen dem Wort ‚Entscheidungen‘ zu bekommen und ‚Standard‘:

Declaratory judgmentsStandard of review. 

Stattdessen hat ich die boxy Sache mit den vier kleinen Zahlen in ihm. Es scheint nicht hier natürlich zu zeigen, aber ich denke, die Zahlen 0097 sind, die dem entspricht, was ich, wenn ich tun:

repr(foo) 
u'Declaratory judgments\x97Standard of review.' 

Also diese Art von Sinn macht, aber wo ist mein endash?

Der Prozess läuft darauf hinaus:

  1. Requests lädt eine Seite und decodiert auf intelligente Weise den Text in eine Unicode-Objekt
  2. ich mit ihm arbeiten
  3. ich es utf-8 kodieren und drucken es aus.

Wo ist das Problem? Das hört sich nach der mythical unicode sandwich an, mir fehlt aber eindeutig etwas.

Antwort

4

Sie tun etwas seltsam. \x97 ist ein Emdash in der cp1252 Codierung. In einer Unicode-Zeichenfolge ist es U+0097 END OF GUARDED AREA. Irgendwie lesen Sie cp1252 Bytes als Unicode. Zeigen Sie mehr Code, der Sie in diesen Zustand versetzt hat, und wir können tiefer graben.

PS: Das Unicode-Sandwich ist kaum mythisch, es ist ein Ideal, nach dem man streben sollte! :)

+0

Yup! Du hast den Nagel auf den Kopf getroffen. Die [Seite] (http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669) ist das Problem. Es deklariert keine Codierung, so dass chardet es als 'ISO-8859-1' erkennt und Anforderungen als solche decodiert. Dann, wenn ich es als utf-8 kodiere, scheitert das natürlich auch. Woher weißt du das von oben? Ich möchte das in Zukunft vermeiden? – mlissner

+0

Oh, und eine andere Frage ... Firefox und Chrome erkennen diese Seite auch als iso-8859-1 ... aber sie zeigen die Emdashes perfekt! Was ist ihr Trick? – mlissner

+0

Lange Erfahrung sagt mir, dass Zeichen wie eldash bei \ x9X codiert ist wahrscheinlich cp1252. Das Nachschlagen auf Wikipedia bestätigte, dass cp1252 das von Ihnen gezeigte Byte dem erwarteten Zeichen zuordnet. cp1252 ist eigentlich eine Obermenge von iso8859-1, mit druckbaren Zeichen, bei denen iso8859-1 keine hat. Also, wenn Browser sagen, dass sie 8859-1 verwenden, verwenden sie tatsächlich cp1252, denn warum nicht, es macht nur mehr Zeichen druckbar. –

Verwandte Themen