我需要从具有非ascii字符的URL中获取数据,但是urllib2.urlopen拒绝打开资源并引发:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0131' in position 26: ordinal not in range(128)我知道URL不符合标准,但我没有机会更改它。
使用Python访问包含非ascii字符的URL所指向的资源的方法是什么?
编辑:,换句话说,可以/如何打开URL,例如:
http://example.org/Ñöñ-ÅŞÇİİ/发布于 2010-12-08 19:13:27
严格地说,URI不能包含非ASCII字符;您拥有的是一个IRI。
若要将IRI转换为普通的ASCII URI,请执行以下操作:
所以:
import re, urlparse
def urlEncodeNonAscii(b):
return re.sub('[\x80-\xFF]', lambda c: '%%%02x' % ord(c.group(0)), b)
def iriToUri(iri):
parts= urlparse.urlparse(iri)
return urlparse.urlunparse(
part.encode('idna') if parti==1 else urlEncodeNonAscii(part.encode('utf-8'))
for parti, part in enumerate(parts)
)
>>> iriToUri(u'http://www.a\u0131b.com/a\u0131b')
'http://www.xn--ab-hpa.com/a%c4%b1b'(从技术上讲,这在一般情况下仍然不够好,因为urlparse不会分割主机名上的任何user:pass@前缀或:port后缀。只有主机名部分应该被编码。在构建URL时使用普通的urllib.quote和.encode('idna')进行编码比将IRI分开要容易得多。)
发布于 2015-03-24 11:32:16
在python3中,对非ascii字符串使用urllib.parse.quote函数:
>>> from urllib.request import urlopen
>>> from urllib.parse import quote
>>> chinese_wikipedia = 'http://zh.wikipedia.org/wiki/Wikipedia:' + quote('首页')
>>> urlopen(chinese_wikipedia)发布于 2013-08-16 08:56:41
Python 3有处理这种情况的库。使用urllib.parse.urlsplit将URL拆分为其组件,使用urllib.parse.quote正确引用/转义unicode字符,并使用urllib.parse.urlunsplit将其重新连接起来。
>>> import urllib.parse
>>> url = 'http://example.com/unicodè'
>>> url = urllib.parse.urlsplit(url)
>>> url = list(url)
>>> url[2] = urllib.parse.quote(url[2])
>>> url = urllib.parse.urlunsplit(url)
>>> print(url)
http://example.com/unicod%C3%A8https://stackoverflow.com/questions/4389572
复制相似问题