使用 urllib 打开带有重音符号的 url

Using urllib to open a url with an accent

我正在尝试使用 urllib 中的 urlopen 打开 url,但由于 URL 中的重音符号而出现错误:

import urllib
import ssl
context = ssl._create_unverified_context()
url = 'https://en.wikipedia.org/wiki/Raúl_Grijalva'
page = urllib.request.urlopen(url, context=context)
UnicodeEncodeError: 'ascii' codec can't encode character '\xfa' in position 12: ordinal not in range(128)

我发现 答案建议在字符串和编码中添加一个 u,但这给了我一个不同的错误:

import urllib
import ssl
context = ssl._create_unverified_context()
url = u'https://en.wikipedia.org/wiki/Raúl_Grijalva'
page = urllib.request.urlopen(url.encode('UTF-8'), context=context)
AttributeError: 'bytes' object has no attribute 'timeout'

我在那个答案中确实注意到他们使用 urllib.urlopen 而不是 urllib.request.urlopen 我不确定它们之间的区别是什么,但是前者抛出一个错误 urllib 没有那个属性。

如何正确处理url中的这个字符?

使用 parse.quote() 转义带有重音字符的文本似乎可行:

from urllib import request, parse
import ssl

context = ssl._create_unverified_context()
url = 'https://en.wikipedia.org/'
path = parse.quote('wiki/Raúl_Grijalva')

page = request.urlopen(url + path, context=context)