代码之家  ›  专栏  ›  技术社区  ›  Matthew Winfield

Python 3.6 urllib TypeError:无法将字节连接到str

  •  19
  • Matthew Winfield  · 技术社区  · 9 年前

    import urllib.request, json
    
    headers = {"authorization" : "Bearer {authorization_token}"}
    
    with urllib.request.urlopen("{api_url}", data=headers) as url:
       data = json.loads(url.read().decode())
       print(data)
    

    我得到的错误消息是:

    Traceback (most recent call last):
      File "getter.py", line 5, in <module>
    with urllib.request.urlopen("{url}", data=headers) as url:
       File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
      File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 526, in open
    response = self._open(req, data)
      File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 544, in _open
    '_open', req)
      File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
      File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
      File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
      File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
      File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
      File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
      File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1064, in _send_output
    + b'\r\n'
    TypeError: can't concat bytes to str
    
    Process finished with exit code 1
    

    1 回复  |  直到 6 年前
        1
  •  24
  •   Nick Chapman    9 年前

    这个 data 参数应为类似字节的对象。您需要执行以下操作:

    urllib.request.urlopen({api_url}, data=bytes(json.dumps(headers), encoding="utf-8"))