未加星标

Python 中的 urlencode 和 urldecode 操作

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二03 | 时间 2019 | 作者 红领巾 ] 0人收藏点击收藏

Web 编程中由于需要用 Form 或 URL 来传递参数,所以必然会有 urlencode 和 urldecode 的操作,python Web 也不例外。Python 对 URL 的编解码操作提供了 urllib 模块,下面例子中所使用的 Python 版本是 3.6.7,不同的 Python 版本可能略有差异。

简面言之本文就是关于以下六个函数的使用,更多关于 urllib 的用法请自行进一步研究。

from urllib.parse import urlencode, parse_ql, quote, quote_plus, unquote, unquote_plus

为什么两个 urlencode 和 urldecode 操作会涉及到六个函数的应用呢,分别来讲述

1. urlencode

Python 的 urllib 直接提供了 urlencode 函数,它的操作数是一个字典

>>> urlencode({'user': "O'Neil", 'message': 'hello world'}) 'user=O%27Neil&message=hello+world'

字典中的多个 key-value 值用 & 连接成一个查询字符串。

并且注意到这里的 urlencode 函数,特殊字符编码为 %xx 的形式,并且空格转换为加号 + ,而不是编码为 %20 , 这有可能造成解码时不一致而把加号 + 作为一个实际的字符来处理。

如果希望空格编译编码为 %20 , 而非加号 + 的话,调用 urlencode 函数可以由参数 quote_via 指定为 quote ,它的默认值为 quote_plus ,即空格替换为加号 + 。

>>> urlencode({'user': "O'Neil", 'message': 'hello world'}, quote_via=quote) 'user=O%27Neil&message=hello%20world'

urlencode 是针对字典的操作,也可以单独对一个字符串值进行编码,基于是否把空格替换为加号 + 的不同行为,分别有 quote 和 quote_plus 操作,分别看下面的例子

>>> quote("O'Neil,Hello World") 'O%27Neil%2CHello%20World' >>> quote_plus("O'Neil,Hello World") 'O%27Neil%2CHello+World' 2. urldecode

urllib 并没有与 urlencode 函数相对应的 urldecode 函数名,实际上 urlencode 反作用的的函数是 parse_ql ,它把一个查询字符串转换为字典,而且还同时兼容空格的 %20 和 + 的两种表现形式。见下面的例子

>>> parse_qs('user=O%27Neil&message=hello%20world') {'user': ["O'Neil"], 'message': ['hello world']} >>> parse_qs('user=O%27Neil&message=hello+world') {'user': ["O'Neil"], 'message': ['hello world']}

请留意 parse_ql 得到的字典的值是一个列表,因为 HTTP 的查询字符串中相同的 key 可以出现多次,如

>>> parse_qs('user=O%27Neil&message=hello%20world&message=Hello+World') {'user': ["O'Neil"], 'message': ['hello world', 'Hello World']}

如果确定 querystring 中不会有重复的 key,可以对 parse_ql 得到的字典进一步转换

>>> {key: value[0] for (key, value) in parse_qs('user=O%27Neil&message=hello+world').items()} {'user': "O'Neil", 'message': 'hello world'}

与 quote 和 quote_plus 相对应的操作有 unquote 和 unquote_plus 应该就好理解了,也是单独对某个字符串的操作,直接看代码就好了

>>> unquote("O'lNeil,Hello%20World") "O'lNeil,Hello World" >>> unquote("O'lNeil,Hello+World") "O'lNeil,Hello+World" >>> unquote_plus("O'lNeil,Hello%20World") "O'lNeil,Hello World" >>> unquote_plus("O'lNeil,Hello+World") "O'lNeil,Hello World" >>> >>> unquote_plus('user=O%27Neil&message=hello+world') "user=O'Neil&message=hello world"

unquote 无法把加号 + 还原为空格,而使用 unquote_plus 好像总是更保险。是否有 URL 中的加号不进行编码呢,保持为 + ?应该不会,加号 + 也不过是被编码为 %2B 而已。

同时, unquote 或 unquote_plus 对 & 符号是无害的,所以它也能直接对整个查询字符串进行解码。

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

代码区博客精选文章
分页:12
转载请注明
本文标题:Python 中的 urlencode 和 urldecode 操作
本站链接:https://www.codesec.net/view/627797.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(34)