Gre*_*reg 30 python urllib urllib2 python-2.7 python-3.x
我正在尝试将Python 2.7代码转换为Python 3代码,并且我从urllib请求模块收到类型错误.
我使用内置的2to3 Python工具转换下面的工作urllib和urllib2 Python 2.7代码:
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()
Run Code Online (Sandbox Code Playgroud)
2to3模块的输出是以下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()
Run Code Online (Sandbox Code Playgroud)
运行Python 3代码时,会产生以下错误:
---------------------------------------------------------------------------
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.
Run Code Online (Sandbox Code Playgroud)
我还读了两张提到编码日期的票(ticket1和ticket2).
当我将行更改f = urllib.request.urlopen(req)为f = urllib.request.urlopen(req.encode('utf-8'))I时收到以下错误:AttributeError: 'Request' object has no attribute 'encode'
我被困在如何使Python 3代码工作.请你帮助我好吗?
Pad*_*ham 52
从文档中 注意,urlencode的params输出在作为数据发送到urlopen之前被编码为字节:
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)
Run Code Online (Sandbox Code Playgroud)
尝试这个:
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)
Run Code Online (Sandbox Code Playgroud)
您的问题在于您处理字典的方式。
| 归档时间: |
|
| 查看次数: |
44096 次 |
| 最近记录: |