2013-12-12 4 views
7

Ci sono apparentemente un milione di domande che coinvolgono gli errori Python Unicode in cui il ...ordinal [is] not in range(128). Apparentemente, la grande maggioranza coinvolge Python 2.x.Python 3.3 è migliore di 2.7 per la decodifica e la ricodifica del testo Web raschiato su UTF-8 ?? Tipo, molto meglio?

Conosco questi errori perché attualmente sto codificando, decodificando l'inferno. Per un side-project, scroto le pagine web e cerco di normalizzare i dati di testo, in modo che non compaiano sul nostro sito con caratteri pazzi. Per normalizzare i dati, mi baso su HTMLParser di HTMLParser() e entitydefs, così come la decodifica del testo da qualunque sua forma originale era (string.decode('[original encoding]', 'ignore')) e la codifica UTF-8 (string.encode('utf-8', 'ignore')).

Eppure, apparentemente, c'è sempre un sito su cui i miei sforzi falliscono, sollevando la stessa vecchia UnicodeError: ASCII decoding error...ordinal not in range(128). e 'così fastidioso.

ho letto (e herehere), che in Python 3 tutto il testo è Unicode. Anche se ho letto molto su Unicode, perché io Non sono un ingegnere del software, non so se Unicode è oggettivamente migliore (cioè, tasso di errore inferiore) rispetto all'opzione di codifica ascii predefinita 2.x. Devo pensare che tutto sarebbe meglio, bu Mi piacerebbe se qualcuno più esperto ed esperto potesse dare una prospettiva.

Mi piacerebbe sapere se dovrei migrare a Python 3 per la sua (migliorata) elaborazione del testo raschiato dal web. Spero che qualcuno qui possa spiegare (o suggerire risorse che spieghino) i pro e i contro dell'approccio di Python 3 all'elaborazione del testo. È meglio?? C'è qualcuno che ha affrontato il mio stesso problema che è già migrato a Python 3 ?? Mi consiglierebbe di iniziare a utilizzare Python 3, se la migrazione dello 2to3 non fosse un problema ??

Grazie in anticipo per qualsiasi assistenza. Ne ho davvero bisogno.

+4

Letture consigliate: http://blog.notdot.net/2010/07/Getting-unicode-right-in-Python – dan04

+3

Leggere il link @ dan04 fornito. Python 3 è molto meglio di Python 2 qui * una volta che sai cosa stai facendo * a causa di "esplicito è meglio di implicito". Cioè, Python 3 costruisce un muro alto tra stringhe Unicode e sequenze di byte - molti problemi qui in Python 2 sono dovuti a tentativi errati di convertire "magicamente" tra di loro. –

+0

@ dan04 Lo leggerò sicuramente. Grazie ragazzi. –

risposta

10

Parlerò dal punto di vista di un utente di Python 2.7.

È vero che Python 3 introduce alcune grandi modifiche nel campo Unicode. Non dirò che è più facile lavorare con encodings in Python 3, ma è davvero più ragionevole fare cose i18n.

Come ho detto, io uso Python 2.7 e finora sono stato in grado di gestire ogni problema encoding che ho trovato. Devi solo capire cosa sta succedendo sotto il cofano, e avere uno sfondo molto ragionevole di ciò che è encodings, naturalmente: this is the best article there is to understand encodings.

In quell'articolo, Joel dice qualcosa che è necessario tenere a mente ogni volta che si incontrano se stessi in un encoding situazione:

Non ha senso avere una stringa senza sapere che cosa la codifica utilizza.

Detto questo, il mio suggerimento di avvicinarsi il tuo problema con Python 2.7 sarebbe qualcosa di simile:

    articolo naturalmente
  1. Leggi Joel (lettura grande e avrà solo 30 minuti o meno)
  2. Capire che cosa sta utilizzando la pagina web encoding (lo si può vedere osservando Response headers o in un campo in BeautifulSoup.
  3. .decode() la stringa recuperata utilizzando il encoding si capito
  4. Quando si decode, non si dispone di più un oggetto str, si dispone di un oggetto unicode.
  5. unicode è solo una rappresentazione interna, non una codifica reale, quindi se si desidera eseguire l'output del contenuto da qualche parte, sarà necessario lo .encode() e si consiglia di utilizzare utf-8 ovviamente.

Ora, alcuni punti devono essere capiti. Forse la pagina web che stai raschiando non è codifica consapevole e dice che utilizza alcuni encoding ma non si attacca ad esso. Questo è un errore del webmaster, ma devi fare qualcosa per capirlo. Avete 3 scelte:

  1. ,ignore caratteri che possono essere problematici. Passali tranquillamente.
  2. Ci sono buone librerie Python che cercano di capire quale codifica sta usando una stringa. Quelli sono molto precisi ma, naturalmente, non una pallottola d'argento. Possono non riescono a indovinare, specialmente quando il encoding è malformato
  3. arrabbiarsi e cadere il progetto;) (io davvero non consiglio questo uno)

Per ottenere encodings destra, è necessaria una certa quantità di disciplina dalla fonte e dal client. Devi sviluppare il tuo programma giusto, ma è necessario che le informazioni sulla codifica e la codifica reale alla corrispondenza di origine.

Python 3 migliorare la sua unicode occupa delle ma se non si capisce cosa sta succedendo, probabilmente sarà inutile. La cosa migliore che puoi fare è capire encodings (non è difficile, ancora una volta, leggere Joel!) E una volta capito, sarai in grado di elaborarlo con Python 2.7, Python 3.3 e anche PHP;)

Spero che questo aiuti!

+0

Grazie per i tuoi consigli - molto utile. –

+0

@BeeSmears: prego. Spero che tu possa capirlo :) –

+2

Un pezzo molto bello, pieno di buoni fatti salutari e nessuna di quelle brutte cose di opinione! ;) –

Problemi correlati