【python】TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.

深度链接 / 2023-12-06 21:48:36 / 167

使用POST传递参数时出现POST data should be bytes or an iterable of bytes

1、错误重现

[root@wrx python3]# vim spider.py

#!/usr/local/bin/python3

import urllib.request
import urllib.parse
import re

url = "http://www.sdlj.ltd/article"
values = {"id":"23"}
data = urllib.parse.urlencode(values)
request = urllib.request.Request(url,data)
response = urllib.request.urlopen(request)
html = response.read()
print(html)


#执行结果
[root@wrx python3]# python3 spider.py
Traceback (most recent call last):
  File "spider.py", line 11, in <module>
    response = urllib.request.urlopen(request)
  File "/usr/local/lib/python3.4/urllib/request.py", line 161, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.4/urllib/request.py", line 462, in open
    req = meth(req)
  File "/usr/local/lib/python3.4/urllib/request.py", line 1113, in do_request_
    raise TypeError(msg)
TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.

2、查询资料得知需要在urllib.parse.urlencode(values)后面加上encode(encoding="utf-8")

#修改后如下
#!/usr/local/bin/python3

import urllib.request
import urllib.parse
import re

url = "http://www.sdlj.ltd/article"
values = {"id":"23"}
data = urllib.parse.urlencode(values).encode(encoding="utf-8") #此处有修改
request = urllib.request.Request(url,data)
response = urllib.request.urlopen(request)
html = response.read()
print(html)

#执行结果
[root@wrx python3]# python3 spider.py
Traceback (most recent call last):
  File "spider.py", line 11, in <module>
    response = urllib.request.urlopen(request)
  File "/usr/local/lib/python3.4/urllib/request.py", line 161, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.4/urllib/request.py", line 470, in open
    response = meth(req, response)
  File "/usr/local/lib/python3.4/urllib/request.py", line 580, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/lib/python3.4/urllib/request.py", line 508, in error
    return self._call_chain(*args)
  File "/usr/local/lib/python3.4/urllib/request.py", line 442, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.4/urllib/request.py", line 588, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request