【问题标题】:python3 urrlib.request.urlopen UnicodeEncodeError: 'ascii' [duplicate]python3 urrlib.request.urlopen UnicodeEncodeError:'ascii' [重复]
【发布时间】:2015-10-21 15:49:51
【问题描述】:

我的 url 请求有问题:

req = 'https://www.facebook.com/127573287311337'
handler = urllib.request.urlopen(req, timeout=30)

引发异常:

    Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/lib/MyRequests.py", line 104, in str_from_url
    handler = urllib.request.urlopen(req, timeout=timeout)
  File "/usr/lib/python3.4/urllib/request.py", line 153, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.4/urllib/request.py", line 461, in open
    response = meth(req, response)
  File "/usr/lib/python3.4/urllib/request.py", line 571, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.4/urllib/request.py", line 493, in error
    result = self._call_chain(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 433, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 676, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python3.4/urllib/request.py", line 461, in open
    response = meth(req, response)
  File "/usr/lib/python3.4/urllib/request.py", line 571, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.4/urllib/request.py", line 493, in error
    result = self._call_chain(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 433, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 676, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python3.4/urllib/request.py", line 455, in open
    response = self._open(req, data)
  File "/usr/lib/python3.4/urllib/request.py", line 473, in _open
    '_open', req)
  File "/usr/lib/python3.4/urllib/request.py", line 433, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 1273, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/usr/lib/python3.4/urllib/request.py", line 1232, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "/usr/lib/python3.4/http/client.py", line 1065, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python3.4/http/client.py", line 1093, in _send_request
    self.putrequest(method, url, **skips)
  File "/usr/lib/python3.4/http/client.py", line 957, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)

我猜 urllib.request 将 url ('https://www.facebook.com/127573287311337') 转换为 'https://www.facebook.com/Señoras-que-llevan-el-tupper-en-bolsas-de-Chanel-127573287311337/' 您可以看到不是 ascii 的字母“ñ”,因此异常是“正常的”。

有人有帮助我的想法吗?

谢谢。

【问题讨论】:

    标签: python-3.x encode urllib urlopen


    【解决方案1】:

    解决方案非常简单。您作为参数输入的 URL 应该已经被编码为 ASCII。您必须做的是参数,因此它以 ASCII 而不是 Unicode 编码(我相信这是默认的字符串编码)。

    代码应该是:

        url = 'https://www.facebook.com/127573287311337'.encode("ascii")
        handler = urllib.request.urlopen(url, timeout=timeout)
    

    这意味着 URL 从一开始就以正确的格式编码。

    为了将来参考,您应该提供更多关于所有变量相等的细节;我们真的更喜欢在这个网站上能够复制问题,在这种情况下(因为我没有超时值)我提出了一个不同的错误。

    【讨论】:

    • 它什么都没有改变,因为问题不是基本网址而是“重定向”之后的网址(西班牙语中的一些字母)。 PS:我更改了变量超时。
    • 我忘记了错误:urllib.error.URLError:
    • 应该是URL编码的;这与编码为字节不同。 URL 编码的 URL 是 ASCII 安全的。
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2021-12-17
    • 2017-02-28
    • 2019-12-24
    • 2017-12-08
    • 2016-09-25
    相关资源
    最近更新 更多