Repository 32bit  Forum
Repository 64bit  Wiki

python UnicodeDecodeError:

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 15: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 8 volte
Avatar utente
venerdi_12
Packager
Packager
 
Messaggi: 258
Iscritto il: sab lug 09, 2005 0: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: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: 2571
Iscritto il: mer ago 29, 2007 17:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.9.5-ck1
Desktop: XFCE 4.6.1

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 16: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: sab lug 09, 2005 0: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 16:58

venerdi_12 ha scritto:In realtà ci avevo provato

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

Re: python UnicodeDecodeError:

Messaggioda 414N » sab feb 19, 2011 17: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: 2853
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 18: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: sab lug 09, 2005 0: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: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: sab lug 09, 2005 0: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 19: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: 2853
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: python UnicodeDecodeError:

Messaggioda venerdi_12 » sab feb 19, 2011 20: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: sab lug 09, 2005 0: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 20: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: sab lug 09, 2005 0: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 12: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: sab lug 09, 2005 0: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 21: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: 2853
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite