2009-12-16 15 views
9

usando Python 2.5.2 y Debian Linux que estoy tratando de obtener el contenido de un URL español que contiene un char español ('I'):no se puede abrir url Unicode con el pitón

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

I estoy poniendo este error:

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

he intentado usar antes de pasar la url para urllib esto:

url = urllib.quote(url)

y esto:

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

pero no funciona

puede decirme lo que estoy haciendo mal?

Respuesta

3

por la norma aplicable, RFC 1378, las direcciones URL sólo pueden contener caracteres ASCII. here buena explicación, y 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."

Como las direcciones URL que he dado a explicar, esto probablemente significa que tendrá que reemplazar esa "i minúscula con acento agudo" con `% ED'.

+4

Creo que esto ya ha cambiado, y por lo los dominios menos pueden ahora contener caracteres Unicode arbitrarios. – Cerin

+0

@Cerin tipo de. [Los IRI pueden contener caracteres Unicode arbitrarios] (https://www.w3.org/International/articles/idn-and-iri), pero cuando los convierte a URI normales, se normalizan en ASCII usando 'Punycode' (para el componente de dominio) y la codificación porcentual (para el componente de ruta). –

4

La codificación de la URL como utf-8, debería haber funcionado. Me pregunto si su archivo fuente está codificado correctamente y si el intérprete lo sabe. Si el archivo de origen pitón se guarda como UTF-8, por ejemplo, entonces usted debe tener

# coding=UTF-8 

como la primera o segunda línea.

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

trabaja para mí.

Editar: también, tenga en cuenta que el texto Unicode en una sesión interactiva de Python (ya sea a través de IDLE, o una consola) está plagado de dificultades relacionadas con la codificación. En esos casos, debe usar literales Unicode (como \ u00ED en su caso).

6

Esto funciona para mí:

#!/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

Funciona para mí. Asegúrese de estar utilizando una versión bastante reciente de Python, y la codificación de su archivo es correcta. Aquí está mi código:

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

(no existe mydomain.es, por lo que la búsqueda de DNS falla, pero no hay problemas de Unicode a ese punto.)

+2

Con python 3 obtengo 'AttributeError: el objeto 'bytes' no tiene ningún atributo 'timeout'' cuando usa este código. ¿Hay una solución Python 3? – byxor

+1

@BrandonIbbotson Deberías probar: 'urllib.parse.quote (url)' en lugar de 'url.encode ('utf-8') ' Puedes leer más sobre esto aquí: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

¡Gracias @Staparse! – byxor

Cuestiones relacionadas