无法用Python打开Unicode URL

11 投票
5 回答
25485 浏览
提问于 2025-04-15 17:06

我在使用Python 2.5.2和Linux Debian,想从一个包含西班牙字符'í'的西班牙网址获取内容:

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

但是我遇到了这个错误:

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

在把网址传给urllib之前,我试过这样做:

url = urllib.quote(url)

还有这样:

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

但是都没有成功。

你能告诉我我哪里做错了吗?

5 个回答

4

把网址编码成utf-8应该是可以的。我在想你的源文件是不是编码正确,以及解释器是否知道这一点。例如,如果你的Python源文件是以UTF-8格式保存的,那么你应该在文件的第一行或第二行加上

# coding=UTF-8

这样就可以了。

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

对我来说是有效的。

补充一下,要注意在交互式的Python环境中(无论是通过IDLE还是控制台),处理Unicode文本时会遇到很多编码方面的问题。在这种情况下,你应该使用Unicode字面量(比如在你的例子中用到的\u00ED)。

7

这个对我有效:

#!/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()
5

根据相关标准,RFC 1738,网址(URL)只能包含ASCII字符。这里有个很好的解释在这里,我引用一下:

“...网址中只能使用字母数字字符 [0-9a-zA-Z],特殊字符 "$-_.+!*'(),"(不包括引号 - 编辑),以及用于其保留目的的保留字符,才能不经过编码直接使用。”

根据我给出的网址,这可能意味着你需要把那个“带重音的小写字母i”替换成 `%ED'。

撰写回答