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.
Rispondi
Avatar utente
venerdi_12
Packager
Packager
Messaggi: 258
Iscritto il: sab 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

python UnicodeDecodeError:

Messaggio da venerdi_12 »

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 103 volte

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: python UnicodeDecodeError:

Messaggio da Ansa89 »

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
venerdi_12
Packager
Packager
Messaggi: 258
Iscritto il: sab 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

Re: python UnicodeDecodeError:

Messaggio da venerdi_12 »

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
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: python UnicodeDecodeError:

Messaggio da Ansa89 »

venerdi_12 ha scritto:In realtà ci avevo provato
Con quale programma?

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: python UnicodeDecodeError:

Messaggio da 414N »

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
venerdi_12
Packager
Packager
Messaggi: 258
Iscritto il: sab 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

Re: python UnicodeDecodeError:

Messaggio da venerdi_12 »

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 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

Re: python UnicodeDecodeError:

Messaggio da venerdi_12 »

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
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: python UnicodeDecodeError:

Messaggio da 414N »

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
venerdi_12
Packager
Packager
Messaggi: 258
Iscritto il: sab 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

Re: python UnicodeDecodeError:

Messaggio da venerdi_12 »

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 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

Re: python UnicodeDecodeError:

Messaggio da venerdi_12 »

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 9 lug 2005, 0:00
Nome Cognome: Luciano Fattore
Kernel: 3.0
Desktop: kde-4.7.0
Distribuzione: archlinux
Località: Lusciano (Ce)

Re: python UnicodeDecodeError:

Messaggio da venerdi_12 »

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
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: python UnicodeDecodeError:

Messaggio da 414N »

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...

Rispondi