2009-12-16 5 views
9

с помощью Python 2.5.2 и Linux Debian я пытаюсь получить содержимое из испанского URL, который содержит испанский символ («I»):не может открыть Юникода URL с питона

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

I «получаю эту ошибку:

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

Я попытался с помощью, прежде чем передать URL в URLLIB это:

url = urllib.quote(url)

и это:

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

, но он не работает

вы можете сказать мне, что я делаю неправильно?

ответ

3

согласно действующему стандарту, RFC 1378, URL может содержать только ASCII символы. Хорошее объяснение here, и я цитирую:

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

В качестве URL-адреса я дал объяснения, это, вероятно, означает, что вам придется заменить, что «в нижнем регистре я с острым ударением» с `% ED».

+4

Я считаю, что это было с тех пор изменилось, и на наименьшие домены теперь могут содержать произвольные символы Unicode. – Cerin

+0

@Cerin Сортировка. [IRI могут содержать произвольные символы Юникода] (https://www.w3.org/International/articles/idn-and-iri), но когда вы конвертируете их в обычные URI, они нормализуются к ASCII, используя «Punycode» (для компонент домена) и процентное кодирование (для компонента пути). –

4

Кодирование URL-адреса как utf-8 должно работать. Интересно, правильно ли закодирован ваш исходный файл и знает ли его интерпретатор. Если ваш исходный файл питон будет сохранен как UTF-8, например, то вы должны иметь

# coding=UTF-8 

в качестве первой или второй линии.

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

работает для меня.

Редактировать: также помните, что текст Unicode в интерактивном сеансе Python (будь то через IDLE или консоль) чреват сложностью, связанной с кодировкой. В этих случаях вы должны использовать литералы Unicode (например, в вашем случае).

6

Это работает для меня:

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

Это работает для меня. Убедитесь, что вы используете довольно недавнюю версию Python, и ваша кодировка файла верна. Вот мой код:

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

(mydomain.es не существует, поэтому DNS поиск неудачен, но нет никаких проблем Юникода в этой точке.)

+2

С python 3 Я получаю объект AttributeError: 'bytes' при использовании этого кода не имеет атрибута «timeout». Есть ли решение python 3? – byxor

+1

@BrandonIbbotson Вы должны попробовать: 'urllib.parse.quote (url)' вместо 'url.encode ('utf-8') ' Подробнее об этом можно узнать здесь: https://docs.python.org/dev/library/urllib.parse.html#urllib.parse.quote – Snooze

+0

Спасибо @Snooze! – byxor