使用urlencode python构建查询字符串

Ran*_*Rag 9 python dictionary urllib

我正在尝试构建一个url,以便我可以使用urllib模块向它发送get请求.

让我们假设我的final_url应该是

url = "www.example.com/find.php?data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value"
Run Code Online (Sandbox Code Playgroud)

现在实现这一点我尝试了以下方式:

>>> initial_url = "http://www.stackoverflow.com"
>>> search = "Generate+value"
>>> params = {"data":initial_url,"search":search}
>>> query_string = urllib.urlencode(params)
>>> query_string
'search=Generate%2Bvalue&data=http%3A%2F%2Fwww.stackoverflow.com'
Run Code Online (Sandbox Code Playgroud)

现在,如果你将我query_string的格式与final_url你的格式比较,你可以观察两件事

1)params的顺序是反转而不是data=()&search=search=()&data=

2)urlencode也编码+Generate+value

我相信第一个变化是由于字典的随机行为.所以,我虽然OrderedDict用来反转字典.因为,我正在使用python 2.6.5我做的

pip install ordereddict
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时,我无法在我的代码中使用它

>>> od = OrderedDict((('a', 'first'), ('b', 'second')))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'OrderedDict' is not defined
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是OrderedDict在python 2.6.5中使用的正确方法是什么,以及如何urlencode忽略+in Generate+value.

这也是正确的构建方法URL.

Ale*_*nik 20

你不应该担心编码+它应该在unescaping url之后在服务器上恢复.命名参数的顺序也无关紧要.

考虑到OrderedDict,它不是内置的Python.您应该从collections以下位置导入:

from urllib import urlencode, quote
# from urllib.parse import urlencode # python3
from collections import OrderedDict

initial_url = "http://www.stackoverflow.com"
search = "Generate+value"
query_string = urlencode(OrderedDict(data=initial_url,search=search))
url = 'www.example.com/find.php?' + query_string 
Run Code Online (Sandbox Code Playgroud)

如果您的python太旧并且模块中没有OrderedDict collections,请使用:

encoded = "&".join( "%s=%s" % (key, quote(parameters[key], safe="+")) 
    for key in ordered(parameters.keys()))
Run Code Online (Sandbox Code Playgroud)

无论如何,参数的顺序无关紧要.

注意safe参数quote.它可以防止+被转义,但这意味着,服务器将解释Generate+valueGenerate value.您可以+通过编写%2B和标记%为安全字符来手动转义: