python3 libreria python python-2.7 python-3.x urllib2 urllib

libreria - urllib2 python 3 install windows



Python 3 urllib produce TypeError: los datos POST deben ser bytes o una iterable de bytes. No puede ser de tipo str. (2)

Estoy tratando de convertir el código Python 2.7 en código de Python 3 y recibo un error de tipo del módulo de solicitud urllib.

Utilicé la herramienta incorporada Python 2to3 para convertir el código urllib y urllib2 Python 2.7 que funciona a continuación:

import urllib2 import urllib url = "https://www.customdomain.com" d = dict(parameter1="value1", parameter2="value2") req = urllib2.Request(url, data=urllib.urlencode(d)) f = urllib2.urlopen(req) resp = f.read()

La salida del módulo 2to3 fue el siguiente código de Python 3:

import urllib.request, urllib.error, urllib.parse url = "https://www.customdomain.com" d = dict(parameter1="value1", parameter2="value2") req = urllib.request.Request(url, data=urllib.parse.urlencode(d)) f = urllib.request.urlopen(req) resp = f.read()

Cuando se ejecuta el código de Python 3, se produce el siguiente error:

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-56-206954140899> in <module>() 5 6 req = urllib.request.Request(url, data=urllib.parse.urlencode(d)) ----> 7 f = urllib.request.urlopen(req) 8 resp = f.read() C:/Users/Admin/Anaconda3/lib/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context) 159 else: 160 opener = _opener --> 161 return opener.open(url, data, timeout) 162 163 def install_opener(opener): C:/Users/Admin/Anaconda3/lib/urllib/request.py in open(self, fullurl, data, timeout) 459 for processor in self.process_request.get(protocol, []): 460 meth = getattr(processor, meth_name) --> 461 req = meth(req) 462 463 response = self._open(req, data) C:/Users/Admin/Anaconda3/lib/urllib/request.py in do_request_(self, request) 1110 msg = "POST data should be bytes or an iterable of bytes. " / 1111 "It cannot be of type str." -> 1112 raise TypeError(msg) 1113 if not request.has_header(''Content-type''): 1114 request.add_unredirected_header( TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.

También he leído otros dos tickets ( ticket1 y ticket2 ) que mencionan la codificación de la fecha.

Cuando cambié la línea f = urllib.request.urlopen(req) por f = urllib.request.urlopen(req.encode(''utf-8'')) Recibí el siguiente error: AttributeError: ''Request'' object has no attribute ''encode''

Estoy atascado en cuanto a cómo hacer que el código Python 3 funcione. ¿Me podría ayudar?


De la docs Tenga en cuenta que la salida de parámetros de urlencode se codifica en bytes antes de enviarse a urlopen como datos:

data = urllib.parse.urlencode(d).encode("utf-8") req = urllib.request.Request(url) with urllib.request.urlopen(req,data=data) as f: resp = f.read() print(resp)


Prueba esto:

url = ''https://www.customdomain.com'' d = dict(parameter1="value1", parameter2="value2") f = urllib.parse.urlencode(d) f = f.encode(''utf-8'') req = urllib.request.Request(url, f)

Su problema radica en la forma en que maneja el diccionario.