URL编码/解码详解
URL编码/解码详解
当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。
安全字符,指的是没有特殊用途或者特殊意义的字符。
URL基本组成
URL 是由一些简单的组件构成,比如协议、域名、端口号、路径和查询字符串等,示例如下:
http://www.ccc.net/index?param=10
路径和查询字符串之间使用问号?隔开。上述示例的域名为 www.ccc.net,路径为 index,查询字符串为 param=1。
URL 中规定了一些具有特殊意义的字符,常被用来分隔两个不同的 URL 组件,这些字符被称为保留字符。例如:
冒号:用于分隔协议和主机组件,斜杠用于分隔主机和路径
?:用于分隔路径和查询参数等。
=用于表示查询参数中的键值对。
&符号用于分隔查询多个键值对。
其余常用的保留字符有:/ . … # @ $ + ; %
哪些字符需要编码
URL 之所以需要编码,是因为 URL 中的某些字符会引起歧义,比如 URL 查询参数中包含了”&”或者”%”就会造成服务器解析错误;再比如,URL 的编码格式采用的是 ASCII 码而非 Unicode 格式,这表明 URL 中不允许包含任何非 ASCII 字符(比如中文),否则就会造成 URL 解析错误。
URL 编码协议规定(RFC3986 协议):URL 中只允许使用 ASCII 字符集可以显示的字符,比如英文字母、数字、和- _ . ~ ! *这 6 个特殊字符。当在 URL 中使用不属于 ASCII 字符集的字符时,就要使用特殊的符号对该字符进行编码,比如空格需要用%20来表示。
除了无法显示的字符需要编码外,还需要对 URL 中的部分保留字符和不安全字符进行编码。下面列举了部分不安全字符:
[ ] < > " " { } | \ ^ * · ‘ ’ 等
下面示例,查询字符串中包含一些特殊字符,这些特殊字符不需要编码:
http://www.ccc.net/index?param=10!*¶m1=20!-~_
下表对 URL 中部分保留字符和不安全字符进行了说明:
URL特殊字符编码
字符 | 含义 | 十六进制值编码 |
---|---|---|
+ | URL 中 + 号表示空格 | %2B |
空格 | URL中的空格可以编码为 + 号或者 %20 | %20 |
/ | 分隔目录和子目录 | %2F |
? | 分隔实际的 URL 和参数 | %3F |
% | 指定特殊字符 | %25 |
# | 表示书签 | %23 |
& | URL 中指定的参数间的分隔符 | %26 |
= | URL 中指定参数的值 | %3D |
下面简单总结一下,哪些字符需要编码,分为以下三种情况:
ASCII 表中没有对应的可显示字符,例如,汉字。 不安全字符,包括:# ”% <> [] {} | \ ^ ` 。 部分保留字符,即 &
/ : ; = ? @ 。
Python实现编码与解码
Python 的标准库urllib.parse模块中提供了用来编码和解码的方法,分别是 urlencode() 与 unquote() 方法。
方法 | 说明 |
---|---|
urlencode() | 该方法实现了对 url 地址的编码操作 |
unquote() | 该方法将编码后的 url 地址进行还原,被称为解码 |
1) 编码urlencode()
下面以百度搜索为例进行讲解。首先打开百度首页,在搜索框中输入“爬虫”,然后点击“百度一下”。当搜索结果显示后,此时地址栏的 URL 信息,如下所示:
https://www.baidu.com/s?wd=爬虫&rsv_spt=1&rsv_iqid=0xa3ca348c0001a2ab&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=ib&rsv_sug3=8&rsv_sug1=7&rsv_sug7=101
可以看出 URL 中有很多的查询字符串,而第一个查询字符串就是“wd=爬虫”,其中 wd 表示查询字符串的键,而“爬虫”则代表您输入的值。
在网页地址栏中删除多余的查询字符串,最后显示的 URL 如下所示:
https://www.baidu.com/s?wd=爬虫
使用搜索修改后的 URL 进行搜索,依然会得到相同页面。因此可知“wd”参数是百度搜索的关键查询参数。下面编写爬虫程序对 “wd=爬虫”进行编码,如下所示:
#导入parse模块
from urllib import parse
#构建查询字符串字典
query_string = {
'wd' : '爬虫'
}
#调用parse模块的urlencode()进行编码
result = parse.urlencode(query_string)
#使用format函数格式化字符串,拼接url地址
url = 'http://www.baidu.com/s?{}'.format(result)
print(url)
输出结果,如下所示:
wd=%E7%88%AC%E8%99%AB
http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB
编码后的 URL 地址依然可以通过地网页址栏实现搜索功能。
除了使用 urlencode() 方法之外,也可以使用 quote(string) 方法实现编码,代码如下:
from urllib import parse
#注意url的书写格式,和 urlencode存在不同
url = 'http://www.baidu.com/s?wd={}'
word = input('请输入要搜索的内容:')
#quote()只能对字符串进行编码
query_string = parse.quote(word)
print(url.format(query_string))
输出结果如下:
输入:请输入要搜索的内容:编程帮www.biancheng.net
输出:http://www.baidu.com/s?wd=%E7%BC%96%E7%A8%8B%E5%B8%AEwww.biancheng.net
注意:quote() 只能对字符串编码,而 urlencode() 可以直接对查询字符串字典进行编码。因此在定义 URL 时,需要注意两者之间的差异。方法如下:
# urllib.parse
urllib.parse.urlencode({'key':'value'}) #字典
urllib.parse.quote(string) #字符串
2) 解码unquote(string)
解码是对编码后的 URL 进行还原的一种操作,示例代码如下:
from urllib import parse
string = '%E7%88%AC%E8%99%AB'
result = parse.unquote(string)
print(result)
输出结果:
爬虫
3) URL地址拼接方式
最后,给大家介绍三种拼接 URL 地址的方法。除了使用 format() 函数外,还可以使用字符串相加,以及字符串占位符,总结如下:
纯文本复制
# 1、字符串相加baseurl = 'http://www.baidu.com/s?'params='wd=%E7%88%AC%E8%99%AB'url = baseurl + params
# 2、字符串格式化(占位符)params='wd=%E7%88%AC%E8%99%AB'url = 'http://www.baidu.com/s?%s'% params
# 3、format()方法url = 'http://www.baidu.com/s?{}'params='wd=%E7%88%AC%E8%99%AB'url = url.format(params)
URL编码/解码详解相关推荐
- PHP和javascript中url编码解码详解
在实际开发中,我们可能会遇到路径编码解码的问题,下面总结了一下: PHP中: 1.urlencode(编码),urldecode(解码) $a = urlencode('http://www.baid ...
- JavaScript 文本编码解码详解笔记
JavaScript 文本的编码解码 文本编码 文本编码方法分为批量编码和流编码. 1.批量编码 所谓批量编码,指的是JavaScript引擎会同步编码整个字符串.对于非常长的字符串,可能会花较长时间 ...
- python urllib.request 爬虫 数据处理-python爬虫 urllib模块url编码处理详解
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为"周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.s ...
- javascript中的Base64.UTF8编码与解码详解
javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...
- JPG文件编解码详解——详细介绍编码和解码JPG
http://blog.csdn.net/zhengzhoudaxue2/article/details/7693258 JPEG文件编/解码详解 cat_ng 猫猫 JPEG(Joint Photo ...
- 站长在线Python精讲:Python中字符串编码转换encode编码和decode解码详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中字符串编码转换:encode编码和decode解码详解>.本知识点主要内容有:常用编码简介.使用encode( ...
- Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...
- java中文字符怎么保证出现正确_JAVA中文字符编码问题详解
JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用中.网上的分析文章和解决方案都很多,但总是针对某些特定情况的.很多次遇到乱码问题后,经过极为辛苦的调试和搜索资 ...
- (best!)JAVA中文字符编码问题详解
转载自:http://blog.csdn.net/youyue/article/details/4580402 JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应 ...
最新文章
- 跑了4个实验,实战讲解 MySQL的行锁、间隙锁...​
- matlab哈明窗带阻,数字信号处理实验1,2,3,4
- python主进程 子进程_pool主进程捕获子进程异常
- Kafka学习-入门
- matlab fgoalattain,matlab优化工具箱 | 学步园
- inux CentOS 7 修改内核启动默认顺序
- Scala Singleton对象
- Java JDK中文帮助文档免费下载,百度网盘下载。
- 这 4 款电脑记事本软件,得试试
- AP注册不上线(现网中存在其它厂商的控制器)
- 开发计算机软件的基本流程
- 吉他录音混音教程|连这些录音知识都不懂,以后还怎么“混”?| MZD Studios
- 我对kvm,qemu,vmware,xen,virtualbox等虚拟化产品的简单理解
- 基于FPGA的卷积神经网络加速器(绪论)
- (渣男渣女必备之)层次分析法AHP-Analytic Hierarchy Process操作流程及代码实现
- MuJoCo的机器人建模
- 算法设计与分析递归概念之Fibonacci数列
- Java Swing 键盘事件监听
- 【进阶数据挖掘技术】进阶数据挖掘技术介绍
- Linux中解除带锁的文件夹
热门文章
- Gamma阶段第三次scrum meeting
- 分式化简结果要求_分式化简的结果为( ) A. B. C. D.——青夏教育精英家教网——...
- 冲刺港交所上市,瞄准亚太地区未来增长空间,法拉帝或难以圆梦?
- max创意量子计算机,看完AdobeMax2020,80%的设计师都把Mac砸了……
- Spring注解的作用
- 【渝粤教育】广东开放大学 影视艺术概论 形成性考核 (52)
- 金属材料的性能(1)
- 来自中等职业学校第十九届技能竞赛网络搭建与应用竞赛赛,“交换机“和“路由器“解析和参考答案
- Zotero+Quicklook配置教程
- android平板加密软件,购买安卓视频加密软件