在python3版本中,对于以上错误新发现,具体如下:
产生异常代码:
from urllib import request,parse url = "http://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=&start=0&limit=20" headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"} formdata = { 'start': '0', 'limit': '20' } data = parse.urlencode(formdata) req = request.Request(url=url,data=data,headers=headers) response = request.urlopen(req) print(response.read())
运行出现:TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type s
**网上的大部分的解决方案为:data = parse.urlencode.(formdata).encode("utf-8")
以上解决方案能够处理上述问题,但是得出的一堆看不懂的代码,往往达不到要求。因为这里还容易忽略一个decode("utf-8")
正确代码如下:
1 from urllib import request 2 from urllib import parse 3 4 url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=" 5 headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"} 6 formdata = { 7 'start': '0', 8 'limit': '10' 9 } 10 11 data = parse.urlencode(formdata).encode(encoding="utf-8") 12 req = request.Request(url=url,headers=headers) 13 response = request.urlopen(req) 14 print(response.read().decode("utf-8"))
在加上了encode(encoding="utf-8")的同时,在输出时,再使用decode("utf-8")进行解码,往往更加能够取的理想的效果。以上为个人遇见的一个问题,分享给大家。