URL编码/解码详解
当 URL 路径或者查询参数中带有中文或者特殊字符的时候就需要对 URL 进行编码采用十六进制编码格式。URL 编码的原则是使用安全字符去表示那些不安全的字符。安全字符指的是没有特殊用途或者特殊意义的字符。URL基本组成URL 是由一些简单的组件构成比如协议、域名、端口号、路径和查询字符串等示例如下http://www.biancheng.net/index?param10路径和查询字符串之间使用问号?隔开。上述示例的域名为 www.biancheng.net路径为 index查询字符串为 param1。URL 中规定了一些具有特殊意义的字符常被用来分隔两个不同的 URL 组件这些字符被称为保留字符。例如冒号用于分隔协议和主机组件斜杠用于分隔主机和路径?用于分隔路径和查询参数等。用于表示查询参数中的键值对。符号用于分隔查询多个键值对。其余常用的保留字符有/ . ... # $ ; %哪些字符需要编码URL 之所以需要编码是因为 URL 中的某些字符会引起歧义比如 URL 查询参数中包含了””或者”%”就会造成服务器解析错误再比如URL 的编码格式采用的是 ASCII 码而非 Unicode 格式这表明 URL 中不允许包含任何非 ASCII 字符比如中文否则就会造成 URL 解析错误。URL 编码协议规定RFC3986 协议URL 中只允许使用 ASCII 字符集可以显示的字符比如英文字母、数字、和- _ . ~ ! *这 6 个特殊字符。当在 URL 中使用不属于 ASCII 字符集的字符时就要使用特殊的符号对该字符进行编码比如空格需要用%20来表示。除了无法显示的字符需要编码外还需要对 URL 中的部分保留字符和不安全字符进行编码。下面列举了部分不安全字符[ ] { } | \ ^ * · ‘ ’ 等下面示例查询字符串中包含一些特殊字符这些特殊字符不需要编码http://www.biancheng.net/index?param10!*param120!-~_下表对 URL 中部分保留字符和不安全字符进行了说明URL特殊字符编码字符含义十六进制值编码URL 中 号表示空格%2B空格URL中的空格可以编码为 号或者 %20%20/分隔目录和子目录%2F?分隔实际的 URL 和参数%3F%指定特殊字符%25#表示书签%23URL 中指定的参数间的分隔符%26URL 中指定参数的值%3D下面简单总结一下哪些字符需要编码分为以下三种情况ASCII 表中没有对应的可显示字符例如汉字。不安全字符包括# ”% [] {} | \ ^ 。部分保留字符即 / : ; ? 。Python实现编码与解码Python 的标准库urllib.parse模块中提供了用来编码和解码的方法分别是 urlencode() 与 unquote() 方法。方法说明urlencode()该方法实现了对 url 地址的编码操作unquote()该方法将编码后的 url 地址进行还原被称为解码1) 编码urlencode()下面以百度搜索为例进行讲解。首先打开百度首页在搜索框中输入“爬虫”然后点击“百度一下”。当搜索结果显示后此时地址栏的 URL 信息如下所示https://www.baidu.com/s?wd爬虫rsv_spt1rsv_iqid0xa3ca348c0001a2abissp1f8rsv_bp1rsv_idx2ieutf-8tnbaiduhome_pgrsv_enter1rsv_dlibrsv_sug38rsv_sug17rsv_sug7101可以看出 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? paramswd%E7%88%AC%E8%99%AB url baseurl params # 2、字符串格式化占位符 paramswd%E7%88%AC%E8%99%AB url http://www.baidu.com/s?%s% params # 3、format()方法 url http://www.baidu.com/s?{} paramswd%E7%88%AC%E8%99%AB url url.format(params)