Pagina 1 di 1
python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 14:34
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)
Vi chiedo:
Come faccio a sapere a quale carattere si riferisce l'errore? come trovo la posizione 111276 del file?
Grazie
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 14:41
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).
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 15:51
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...
Vedrò di capire qualcosa sull'offset.
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 15:58
da Ansa89
venerdi_12 ha scritto:In realtà ci avevo provato
Con quale programma?
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 16:25
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:
Fai una prova.
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 17:50
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
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 18:07
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:
Fai una prova.
Si così lo script non si blocca però i caratteri non ascii negli articoli del giornale sono visualizzati male; es
"L’anniversario del terremoto potrebbe tornargli…" al posto di
"L’anniversario del terremoto potrebbe tornargli "
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 18:36
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.
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 19:37
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.
Re: python UnicodeDecodeError:
Inviato: sab 19 feb 2011, 19:47
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
Re: python UnicodeDecodeError:
Inviato: dom 20 feb 2011, 11:37
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:
la sostituzione non avviene mentre se faccio:
la sostituzione avviene correttamente
Edit: la sostituzione sono riuscito a farla così:
.
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/
Re: python UnicodeDecodeError:
Inviato: dom 20 feb 2011, 20:18
da 414N
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...