URL编码/解码详解
当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。
安全字符,指的是没有特殊用途或者特殊意义的字符。
URL基本组成
URL 是由一些简单的组件构成,比如协议、域名、端口号、路径和查询字符串等,示例如下:http://www.biancheng网站站点" rel="nofollow" />
?隔开。上述示例的域名为 www.biancheng网站站点" rel="nofollow" /> ?:用于分隔路径和查询参数等。 =用于表示查询参数中的键值对。&符号用于分隔查询多个键值对。其余常用的保留字符有:/ . ... # @ $ + ; %
哪些字符需要编码
URL 之所以需要编码,是因为 URL 中的某些字符会引起歧义,比如 URL 查询参数中包含了”&”或者”%”就会造成服务器解析错误;再比如,URL 的编码格式采用的是 ASCII 码而非 Unicode 格式,这表明 URL 中不允许包含任何非 ASCII 字符(比如中文),否则就会造成 URL 解析错误。
URL 编码协议规定(RFC3986 协议):URL 中只允许使用 ASCII 字符集可以显示的字符,比如英文字母、数字、和- _ . ~ ! *这 6 个特殊字符。当在 URL 中使用不属于 ASCII 字符集的字符时,就要使用特殊的符号对该字符进行编码,比如空格需要用%20来表示。
除了无法显示的字符需要编码外,还需要对 URL 中的部分保留字符和不安全字符进行编码。下面列举了部分不安全字符:下面示例,查询字符串中包含一些特殊字符,这些特殊字符不需要编码:[ ] < > " " { } | \ ^ * · ‘ ’ 等
http://www.biancheng网站站点" rel="nofollow" />
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网站站点" rel="nofollow" />
# 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)
- 随机文章
- 新疆 马尔代夫(新疆游客不断增加,马尔代夫成为热门旅游目的地)
- 北京马尔代夫在哪(北京马尔代夫之旅,美丽海岛等你来!)
- 中国马尔代夫德阳(德阳打造“中国马尔代夫”旅游目的地)
- 国足 马尔代夫 几点(中国足球队在马尔代夫进行比赛的时间安排)
- 马尔代夫饭店图片(壮美马尔代夫——豪华饭店图片欣赏)
- 丽水马尔代夫图片(美丽的丽水:探索神秘的马尔代夫之旅)
- 途牛 马尔代夫(途牛推出特价马尔代夫旅行方案)
- 惠州马尔代夫潜水(惠州水下世界:探秘马尔代夫潜水之旅)
- 离开马尔代夫流程(马尔代夫旅游离开指南:顺畅离境攻略)
- 皇冠假日马尔代夫(皇冠假日度假村在马尔代夫的精彩体验)
- 小毕 马尔代夫(重新探索马尔代夫,跟随小毕的脚步 46)
- 星云 马尔代夫(马尔代夫笼罩在神秘的星云下)
- 渝中半岛马尔代夫(渝中半岛打造仿佛马尔代夫的度假胜地)
- 英雄联盟马尔代夫(英雄联盟将在马尔代夫举办全球总决赛)
- 飞鲸 马尔代夫(飞鲸推出马尔代夫专题,旅游新选择!)
- 隐形马尔代夫模型(隐形旅游胜地:探秘马尔代夫奇妙之旅)
- 澳门马尔代夫旅游(澳门和马尔代夫的旅游攻略和美食推荐)
- 松滋 马尔代夫(松滋游客想去的马尔代夫,成了最美妙旅程)
- 美甲秋冬马尔代夫(秋冬美甲必备:马尔代夫风情指甲艺术)
- 马尔代夫免费攻略(马尔代夫旅行攻略:完美玩转免费景点)
- 马尔代夫产业结构(马尔代夫经济转型:产业结构加速升级)
- 逃离计划马尔代夫(“逃离计划”帮你规划马尔代夫自由行)
- 马尔代夫出什么鱼(马尔代夫珊瑚礁下的丰富海洋生物资源)
- 老梁解说马尔代夫(老梁详解马尔代夫:一个现代化的天堂)
- 淮安 马尔代夫(淮安市民可直飞马尔代夫,航线直达,旅游更方便)
- 马尔代夫别盖小镇(重拾安宁之旅:体验马尔代夫别盖小镇)
- 马尔代夫名胜照片(美不胜收!欣赏马尔代夫最美名胜照片)
- 马尔代夫出现大坑(马尔代夫现现深坑,游客需注意安全!)
- 王子 马尔代夫(王子酒店再登马尔代夫,开设奢华私人岛屿度假酒店)
- 马尔代夫医院项目(重写后的标题:马尔代夫医院项目开启)
