python中使用requests模块http请求时,发现中文参数不会自动的url编码,并且没有找到类似urllib (python3)模块中urllib.parse.quote("中文")手动url编码的方法.研究了半天发现requests模块对中文参数有3种不同的处理方式.
一、requests模块自动url编码参数
要使参数自动url编码,需要将请求参数以字典的形式定义,如下demo:
1
2
3
4
5
6
7
8
9
|
import requests
proxy = { "http" : "http://127.0.0.1:8080" ,
"https" : "http://127.0.0.1:8080" }
def retest():
url = "http://www.baidu.com"
pdict = { "name" : "中文测试" }
requests.post(url = url,data = pdict,proxies = proxy)
|
效果如下图,中文被url编码正确处理
二、参数原样输出,不需要编码处理
使用dictionary定义参数,发送请求时requests模块会自动url编码处理参数.但有些时候可能不需要编码,要求参数原样输出,这个时候将参数直接定义成字符串即可.
1
2
3
4
5
6
7
8
9
|
import requests
proxy = { "http" : "http://127.0.0.1:8080" ,
"https" : "http://127.0.0.1:8080" }
def retest():
url = "http://www.baidu.com"
pstr1 = "name=中文" .encode( "utf-8" )
requests.post(url = url,data = pstr1, proxies = proxy)
|
注:参数需要utf-8编码,否则会报错use body.encode('utf-8') if you want to send it encoded in utf-8.
最后效果如下图,参数原样输出:
三、参数使用format或%格式化,导致参数str变成bytes
有些时候直接定义的字符串参数,其中有的参数是变量,需要format或%格式化控制变量.这个时候会发现格式化后的参数变成了bytes.
1
2
3
4
5
6
7
8
9
|
import requests
proxy = { "http" : "http://127.0.0.1:8080" ,
"https" : "http://127.0.0.1:8080" }
def retest():
url = "http://www.baidu.com"
pstr2 = "name={0}" . format ( "中文" .encode( "utf-8" ))
requests.post(url = url,data = pstr2, proxies = proxy)
|
参数变成了bytes
在该种请求下:
1. 如果参数需要url编码.当参数少的时候可以使用dict定义.如果参数太多,dict比较麻烦,可以针对参数使用urllib.parse.quote("中文")手动encode成url编码.
2. 如果中文参数需要原样输出.将参数格式化完成后再编码即可.pstr2 = "name={0}".format("中文").encode("utf-8")
以上这篇对python中使用requests模块参数编码的不同处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/M1mory/article/details/58309378