Python urllib.request.urlopen: AttributeError: у объекта 'bytes' нет атрибута 'data' - PullRequest
2 голосов
/ 24 сентября 2019

Я использую 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 и 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 и т. Д., Но, похоже, ничего не работает.

1 Ответ

1 голос
/ 24 сентября 2019

Вы кодируете как 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 переданы аргументыдругому классу для создания средства открывания, и этот класс не знает, был ли ему передан URL или экземпляр Request.Таким образом, он проверяет, является ли «url» строкой - если «url» является строкой, он создает Request, если нет, он предполагает, что «url» является экземпляром Request, и пытается установить его атрибут данных,вызывая исключение, которое вы видите.

Код, о котором идет речь, здесь .

...