【问题标题】:UnicodeEncodeError with urlopen(..net/cé..)带有 urlopen(..net/cé..) 的 UnicodeEncodeError
【发布时间】:2019-02-01 07:19:51
【问题描述】:

我正在尝试打开一个包含 Unicode 字符 (é) 的 URL。
当我直接在函数中编写它时,出现此错误:

from urllib.request import urlopen
uClient = urlopen("https://www.mypage.net/céline")

>>> UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 14: ordinal not in range(128)

当我这样写它时,它可以工作:

from urllib.request import urlopen
uClient = urlopen("https://www.mypage.net/cr%C3%A9line")

但它应该以自动方式工作,因此使用编码输出如下:

没有:https://www.mypage.net/c�line

utf-8: b'https://www.mypage.net/c\xc3\xa9line

latin-1: b'https://www.mypage.net/c\xe9line

ascii: b'https://www.mypage.net/cline

所以问题是如何将字符串“https://www.mypage.net/céline”转换成urlopen函数可以使用的东西?

我正在使用 ATOM-Editor 和 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32

谢谢!

【问题讨论】:

    标签: python unicode python-3.6 urlopen


    【解决方案1】:

    请求的 url 必须经过正确的 url 转义才能使用 urlopen

    在您的示例中,这为您提供了正确编码的网址:

    protohost = 'https://example.com/'
    path = 'céline'
    urllib.request.urlopen(f'{protohost}{urllib.request.quote(path)}')
    

    请注意,编码部分如下所示:

    >>> f'{protohost}{urllib.request.quote(path)}'
    'https://example.comc%C3%A9line'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多