Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

2024-05-20

我正在使用 Python 3 并尝试连接到dstk。我收到错误urllib包裹。

我对SO进行了很多研究,但找不到与这个问题类似的东西。

api_url = self.api_base+'/street2coordinates'
api_body = json.dumps(addresses)
#api_url=api_url.encode("utf-8")
#api_body=api_body.encode("utf-8")
print(type(api_url))
response_string = six.moves.urllib.request.urlopen(api_url, api_body).read()
response = json.loads(response_string)

如果我不编码api_url and api_body我得到以下信息:

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1247, in do_request_
    raise TypeError(msg)
TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.

但是如果我尝试将它们编码为utf-8(取消注释行)然后我收到以下错误:

 File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 514, in open
    req.data = data
AttributeError: 'bytes' object has no attribute 'data'

这对我来说似乎是一个循环错误,我无法解决它。我确实尝试从 SO 方面制定解决方案,将其更改为json.load等等,但似乎没有任何作用。


您正在对 url 和请求正文进行编码,但只应对正文进行编码。

这应该有效:

api_url = self.api_base+'/street2coordinates'
api_body = json.dumps(addresses)
api_body=api_body.encode("utf-8")
response_string = six.moves.urllib.request.urlopen(api_url, api_body).read()
response = json.loads(response_string)

urlopen的参数被传递给另一个类来创建一个 opener,而这个类不知道它传递的是 url 还是 aRequest实例。因此它检查“url”是否是一个字符串 - 如果“url”是一个字符串,它会创建一个Request,如果不是,则假定“url”是Request实例并尝试设置其数据属性,导致您看到的异常。

有问题的代码是here https://github.com/python/cpython/blob/46f6c566a888fb637913ef71fed28568180eafb4/Lib/urllib/request.py#L507.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data' 的相关文章

随机推荐