当前位置: 首页 > news >正文

URL编码/解码详解

当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。

安全字符,指的是没有特殊用途或者特殊意义的字符。

URL基本组成

URL 是由一些简单的组件构成,比如协议、域名、端口号、路径和查询字符串等,示例如下:

http://www.biancheng.net/index?param=10

路径和查询字符串之间使用问号?隔开。上述示例的域名为 www.biancheng.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.biancheng.net/index?param=10!*&param1=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)
http://www.jsqmd.com/news/963579/

相关文章:

  • STM8S开发实战:STVD自动生成HEX与BIN文件全攻略
  • Simple Live:跨平台直播聚合应用终极指南,告别频繁切换的烦恼
  • 2026亲测:专业AI智能降重工具首选方案
  • 如何在Mac上零成本实现专业医学影像分析?Horos免费开源工具终极指南
  • 高速差分接口互连实战:LVPECL、CML、LVDS电平匹配与终端设计
  • 2025-2026年全球岗位外包公司推荐:五大口碑产品评测核心能力选择指南价格
  • STM32外部SRAM透明化使用:编译器自动分配与链接脚本配置详解
  • GitHub Copilot 教育学生认证教程
  • 厦门黄金回收避坑指南:收的顶连锁助力市民安心变现 - 奢侈品回收评测
  • Windows右键菜单终极管理指南:如何快速掌握ContextMenuManager
  • 提升效率:用快马一键生成open design资源聚合站,整合无忧
  • 比亚迪携技术鱼池跨界具身智能,新能源车企“军备竞赛”升级!
  • WrenAI容器化实践:构建企业级AI数据上下文层
  • 2026年6月展台设计搭建公司推荐:五大排行专业评测性价比高价格
  • lodash里面的常用方法
  • GNOME扩展管理器终极指南:一站式安装、管理与升级
  • 公众号排版怎么给标题加序号?18款序号标题推荐一键套用简单上手 - 一串葡萄
  • 终极指南:在Obsidian中直接运行30+编程语言的完整解决方案
  • 如何用BilibiliDown轻松下载B站视频:跨平台视频下载器完全指南
  • MATLAB内点法无功优化代码包:含IEEE14节点完整算例与逐行中文注释
  • BTC邮票:比特币链上艺术的「永恒封印」
  • 【C语言】实现简单动态数组(线程安全)
  • 2026散热风扇实力之选:卡固、台湾维宏、SUNON、台达、ADDA等品牌企业综合能力评估 - 品牌企业推荐师(官方)
  • 2026 成都黄金回收商户实力测评,收的顶全国连锁高价夺冠稳居同城榜首 - 奢侈品回收评测
  • 当Git操作失误时,如何优雅地按下“撤销“键?
  • 2026年6月光固化保护套生产厂家选哪家,环氧酚醛/环氧玻璃钢/石墨烯涂料/光固化保护套,光固化保护套批发厂家找哪家 - 品牌推荐师
  • AI智能体的分类及开发
  • 嘴炮Hermes:我干完了!实际啥也没做,咋整?
  • 体育场馆预约系统小程序/网站开发方案|功能详解+个人开发报价+合作全流程
  • 探索oled高级显示:借助快马ai模型生成动画与特效代码