Repository 32bit  Forum
Repository 64bit  Wiki

python UnicodeDecodeError:

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 14:34

Salve,
un mio script python per creare un epub dal giornale cartaceo de "Il fatto quotidiano" ha sempre funzionato bene, ma oggi mi da questo errore:

Traceback (most recent call last):
File "/usr/local/bin/ilfatto2epub-0.1.6.py", line 460, in <module>
main()
File "/usr/local/bin/ilfatto2epub-0.1.6.py", line 232, in main
data = br.open(BASE_URL).get_data().encode('utf-8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 111276: invalid continuation byte

Per fare un po' di debug ho fatto:
Codice: Seleziona tutto
data = br.open(BASE_URL).get_data() #senza encode('utf-8')

e poi ho scritto data in un file che allego (ho dovuto zipparlo altrimenti il sistema non me lo faceva caricare)
Codice: Seleziona tutto
open(str(dirOut) + "debug", "w").write(data)


Vi chiedo:
Come faccio a sapere a quale carattere si riferisce l'errore? come trovo la posizione 111276 del file?
Grazie
Allegati
2011_02_19_Il_fatto_quotidiano_del_sabatodebug.zip
(25.94 KiB) Scaricato 15 volte
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda Ansa89 » sab feb 19, 2011 14:41

venerdi_12 ha scritto:Come faccio a sapere a quale carattere si riferisce l'errore? come trovo la posizione 111276 del file?

Non vorrei dire una cavolata, ma probabilmente con un hex-editor dovresti riuscire a trovare la posizione 111276 (che io interpreto come un offset di 111276 byte dall'inizio del file).
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 15:51

Ansa89 ha scritto:
venerdi_12 ha scritto:Come faccio a sapere a quale carattere si riferisce l'errore? come trovo la posizione 111276 del file?

Non vorrei dire una cavolata, ma probabilmente con un hex-editor dovresti riuscire a trovare la posizione 111276 (che io interpreto come un offset di 111276 byte dall'inizio del file).

In realtà ci avevo provato, ma non sono riuscito a capire come trovare la posizione... :roll:
Vedrò di capire qualcosa sull'offset.
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda Ansa89 » sab feb 19, 2011 15:58

venerdi_12 ha scritto:In realtà ci avevo provato

Con quale programma?
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: python UnicodeDecodeError:

Messaggioda 414N » sab feb 19, 2011 16:25

Interessante questo problemuccio.
Ho provato anche io in due righe di Python:
Codice: Seleziona tutto
s = "è"
u = unicode(s, "utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 0: unexpected end of data

Il tuo byte 0xe8 è quindi una "è" nel testo.
Una soluzione che ho trovato è usare il metodo decode invece di encode:
Codice: Seleziona tutto
s="èàòù"
u=s.decode("8859")

Fai una prova.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 17:50

Ansa89 ha scritto:
venerdi_12 ha scritto:In realtà ci avevo provato

Con quale programma?

Okteta. Solo che la traduzione di offset o posizione è un po' infelice; la chiamano slittamento
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 18:07

414N ha scritto:Interessante questo problemuccio.
Ho provato anche io in due righe di Python:
Codice: Seleziona tutto
s = "è"
u = unicode(s, "utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe8 in position 0: unexpected end of data

Il tuo byte 0xe8 è quindi una "è" nel testo.
Una soluzione che ho trovato è usare il metodo decode invece di encode:
Codice: Seleziona tutto
s="èàòù"
u=s.decode("8859")

Fai una prova.


Si così lo script non si blocca però i caratteri non ascii negli articoli del giornale sono visualizzati male; es
"Lâ&euro;&trade;anniversario del terremoto potrebbe tornargli&#8230" al posto di
"L’anniversario del terremoto potrebbe tornargli "
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda 414N » sab feb 19, 2011 18:36

Quelli mi sembrano codici di escape HTML sopravvissuti. Potresti provare a capire a quali caratteri corrispondo quelle sequenze e lavorarteli con delle regex.
Dato che non sono ancora molto pratico, posso solo consigliarti di dare un'occhiata a script simili già esistenti (per esempio html2text) e/o richiamarli dal tuo script.
Qui sembra esserci qualche dritta aggiuntiva.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 19:37

414N ha scritto:Quelli mi sembrano codici di escape HTML sopravvissuti. Potresti provare a capire a quali caratteri corrispondo quelle sequenze e lavorarteli con delle regex.
Dato che non sono ancora molto pratico, posso solo consigliarti di dare un'occhiata a script simili già esistenti (per esempio html2text) e/o richiamarli dal tuo script.
Qui sembra esserci qualche dritta aggiuntiva.

Proverò a capirci qualcosa.
Una cosa è certa l'html di quel sito è molto sporco. Questo errore, che fino a ieri non si presentava, oggi si verifica anche se provo a scaricare numeri vecchi (scaricati correttamente in passato). Ho già intercettato con espressioni regolari almeno una decina di errori di tag chiusi male o dal nome sbagliato etc.
Il fatto che spesso vengono introdotti altri errori. Ho anche scritto chiedendo maggiore attenzione ma finora senza risposta.
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 19:47

Aggiungo che lanciando lo script a distanza di alcuni minuti la posizione dell'errore cambia: ad esempio ora l'errore dovrebbe essere in questo tag
Codice: Seleziona tutto
<a href="http://www.ilfattoquotidiano.it/2011/02/19/einsulto-i-rom-su-fb-verra-processato-a-breve/92909/?nocache">èinsultò i rom su fb verrà processato a breve…</a>
per la precisione la posizione indicata corrisponde al "?" prima di nocache

Alcuni minuti fa corrispondeva a questo codice:
Codice: Seleziona tutto
<p class="fleft w300" style="border-bottom:1px dashed #a9abae;"><span class="rosso maiuscolo grazie f12">PAGINA 16</span>
      <span class="grigioscuro grazie f12"> | di <span class="italic">Paolo Ojetti</span></span></p>
per la precisione al ">" prima di Paolo Ojetti.

Non vedo il nesso tra le due segnalazioni, ma sono scarso in html
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » dom feb 20, 2011 11:37

venerdi_12 ha scritto:Aggiungo che lanciando lo script a distanza di alcuni minuti la posizione dell'errore cambia: ad esempio ora l'errore dovrebbe essere in questo tag
Codice: Seleziona tutto
<a href="http://www.ilfattoquotidiano.it/2011/02/19/einsulto-i-rom-su-fb-verra-processato-a-breve/92909/?nocache">èinsultò i rom su fb verrà processato a breve…</a>
per la precisione la posizione indicata corrisponde al "?" prima di nocache

Alcuni minuti fa corrispondeva a questo codice:
Codice: Seleziona tutto
<p class="fleft w300" style="border-bottom:1px dashed #a9abae;"><span class="rosso maiuscolo grazie f12">PAGINA 16</span>
      <span class="grigioscuro grazie f12"> | di <span class="italic">Paolo Ojetti</span></span></p>
per la precisione al ">" prima di Paolo Ojetti.

Non vedo il nesso tra le due segnalazioni, ma sono scarso in html


@414N Aveva ragione; sono delle "è". Il problema e che non riesco ad intercettarle con una stringa di sostituzione che funziona in altre parti del testo.
Codice: Seleziona tutto
// browser Internet Explorer
   // è necessario filtrare la versione 4

il problema è la "è" tra "//" (e la cosa mi puzza di problemi di escape) e "necessario".
Se faccio:
Codice: Seleziona tutto
data = re.sub('è','e',data)

la sostituzione non avviene mentre se faccio:
Codice: Seleziona tutto
data = re.sub('necessario','necessirio',data)

la sostituzione avviene correttamente

Edit: la sostituzione sono riuscito a farla così:
Codice: Seleziona tutto
data = re.sub(u'\xe8','e',data)
.
Il problema ora è che nell'epub i caratteri accentati e gli apostrofi sono visualizzati male.

Assodato che:
- il mio script non è stato modificato
- il problema si presenta su tutti i miei pc (slackware e archlinux)
- il problema fino a venerdì non si presentava
- il problema si presenta anche per i numeri del giornale scaricati correttamente nei giorni scorsi

suppongo che sia stato modificato in qualche modo l'header html della pagina
http://www.ilfattoquotidiano.it/giornale-cartaceo/
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: ven lug 08, 2005 23:00
Località: Lusciano (Ce)
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux

Re: python UnicodeDecodeError:

Messaggioda 414N » dom feb 20, 2011 20:18

Il Fatto Quotidiano ha scritto:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="it-IT">
<head profile="http://gmpg.org/xfn/11">


<!-- 1298229393 --><meta name="google-site-verification" content="qwjUO62gN4_XAU_RygD9qP6JjXO5vW88H837QJbTl2Y" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Direi che è chiaramente codificata in UTF-8. Forse il tuo errore è assumere che sia in latin1/iso-8859 e tentare di ricodificarla in UTF-8...
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite