2009-12-16 16 views
9

utilizzando Python 2.5.2 e Linux Debian sto cercando di ottenere il contenuto da un URL spagnolo che contiene un carattere spagnolo ('i'):non può aprire url unicode con il pitone

import urllib 
url = u'http://mydomain.es/índice.html' 
content = urllib.urlopen(url).read()

I 'm questo errore:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)

ho provato con prima di passare l'url a urllib questo:

url = urllib.quote(url)

e questo:

url = url.encode('UTF-8')

ma non funziona

puoi dirmi che cosa sto facendo male?

risposta

3

Per la norma applicabile, RFC 1378, URL possono contenere solo caratteri ASCII. Buona spiegazione here, e cito:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

Come gli URL che ho dato a spiegare, questo probabilmente significa che dovrete sostituire che "i minuscola con accento acuto" con `% ED'.

+4

Credo che questo da allora è stato cambiato, e al i domini minimi ora possono contenere caratteri Unicode arbitrari. – Cerin

+0

@Cerin Sort of. [IRI possono contenere caratteri Unicode arbitrari] (https://www.w3.org/International/articles/idn-and-iri), ma quando li converti in URI regolari vengono normalizzati in ASCII usando 'Punycode' (per il componente del dominio) e la codifica percentuale (per il componente del percorso). –

4

La codifica dell'URF come utf-8 avrebbe dovuto funzionare. Mi chiedo se il tuo file sorgente sia correttamente codificato e se l'interprete lo sa. Se il file sorgente Python viene salvato come UTF-8, per esempio, allora si dovrebbe avere

# coding=UTF-8 

come prima o seconda linea.

import urllib 
url = u'http://mydomain.es/índice.html' 
content = urllib.urlopen(url.encode('utf-8')).read() 

funziona per me.

Modifica: tenere presente che il testo Unicode in una sessione Python interattiva (tramite IDLE o una console) è pieno di problemi relativi alla codifica. In questi casi, dovresti utilizzare valori letterali Unicode (come \ u00ED nel tuo caso).

6

Questo funziona per me:

#!/usr/bin/env python 
# define source file encoding, see: http://www.python.org/dev/peps/pep-0263/ 
# -*- coding: utf-8 -*- 

import urllib 
url = u'http://example.com/índice.html' 
content = urllib.urlopen(url.encode("UTF-8")).read() 
3

Funziona per me. Assicurati di utilizzare una versione abbastanza recente di Python e la codifica del file è corretta. Ecco il mio codice:

# -*- coding: utf-8 -*- 
import urllib 
url = u'http://mydomain.es/índice.html' 
url = url.encode('utf-8') 
content = urllib.urlopen(url).read() 

(mydomain.es non esiste, quindi la ricerca DNS non riesce, ma non ci sono problemi unicode a quel punto.)

+2

Con python 3 ottengo l'attributo 'AttributeError: 'byte' l'oggetto non ha attributo 'timeout'' quando si utilizza questo codice. Esiste una soluzione python 3? – byxor

+1

@BrandonIbbotson Dovresti provare: 'urllib.parse.quote (url)' invece di 'url.encode ('utf-8') ' Puoi leggere di più a riguardo qui: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

Grazie a @Snooze! – byxor

Problemi correlati