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.