python2和python3对于url的解码和编码

本文详细解释了URL为何需要编码和解码,以及在Python中如何实现这一过程。通过实例展示了在Python 2和Python 3中使用urllib库进行URL编码和解码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载:https://www.cnblogs.com/lyxdw/p/9935137.html

某天做爬虫时遇到一个post请求的参数是编码过的字符串如下,看不懂,初步判断可能是url编码

str = "%7B%22ShoppingToken%22%3A%22NewAirChina%257CCA4173%252C1%252C%252C12-CA989%252C1%252C%252C12%257CY%252CV%252C-Y%252CV%252C%257C0%257C3430%252C1564%252CCAGJ-CA%257CNOR%257C%22%2C%22Eligibility%22%3A%22NOR%22%7D"

对于不了解url编码,解码的同学,我简单解释一下,也可以参考  http://www.w3school.com.cn/tags/html_ref_urlencode.html

  URL为何要编码、解码?

      通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据。对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。

      例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

      又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。

 

百度了一下python解码url找到了解决办法,感谢 https://blog.youkuaiyun.com/junli_chen/article/details/50060161

直接把代码贴过来

复制代码

#url编码:
import urllib
url = 'http://test.com/s?wd=哈哈'   #如果此网站编码是gbk的话,需要进行解码,从gbk解码成unicode,再从Unicode编码编码为utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
#结果: http%3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88

#url解码:
import urllib
encoded_url = 'http%3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88'
print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace')  #反过来

复制代码

使用了python2的语法,我使用的python3,所以改了一下语法,发现还不好使,quote报错了

查了查资料原来python3中qutoe和unqutoe被放到了urllib.parse中(python2是在urllib中)    

 

下面贴上python3解码编码的代码:

复制代码

#解码
from urllib import parse
encoded_url = '%7B%22ShoppingToken%22%3A%22NewAirChina%257CCA4173%252C1%252C%252C12-CA989%252C1%252C%252C12%257CY%252CV%252C-Y%252CV%252C%257C0%257C3430%252C1564%252CCAGJ-CA%257CNOR%257C%22%2C%22Eligibility%22%3A%22NOR%22%7D'
print(parse.unquote(encoded_url)

复制代码

#编码
from urllib import parse
url = '{"ShoppingToken":"NewAirChina%7CCA4173%2C1%2C%2C12-CA989%2C1%2C%2C12%7CY%2CV%2C-Y%2CV%2C%7C0%7C3430%2C1564%2CCAGJ-CA%7CNOR%7C","Eligibility":"NOR"}'
print(parse.quote(url))

解码完成发现还有 %&%2之类的没关系,我们把未解密的字符串拿出来再来一次

python2的代码可以参考上面,因为我没装python2,有兴趣的可以自己试一试

<think>好的,用户现在想了解如何在Python中进行URL编码解码,特别是使用urllib.parse模块。我需要根据之前的对话提供的引用内容来构建一个清晰的回答。首先,用户之前的问题是关于获取文件夹文件名,但现在转到了URL处理,不过引用的资料中提到了urllib.parse模块,所以需要专注于这部分。 首先,我需要确认用户的需求:URL编码解码的具体方法,可能涉及urlencode、quote、unquote等函数。根据引用[2],用户可能已经看到了unquote的例子,但需要更全面的讲解。引用[4][5]提到了urllib.parse的功能,包括编码解码、解析构建URL,所以需要覆盖这些方面。 用户的问题提到了“urllib.parse 示例”,所以需要提供具体的代码示例。引用[2]中的例子是解码,但用户需要编码解码两个方面。同时,引用[5]中的urljoin可能不是用户当前的重点,但可以简要提及。引用[3]中的parse_qsl可能涉及查询参数的处理,这也是URL编码的一部分,需要包括进去。 接下来,我需要组织回答的结构。通常,先解释编码解码的基本概念,然后分点介绍不同函数的使用,如quote、unquote、urlencode、parse_qs、parse_qsl等。每个部分都要有示例代码,并说明应用场景。同时,注意用户可能需要处理查询参数,所以需要展示如何编码字典参数,以及如何解码查询字符串。 还要考虑用户可能的常见问题,比如处理空格为加号还是%20,不同编码函数的区别,以及如何处理异常情况。引用中提到urljoin的例子,可以放在构建完整URL的部分,作为扩展应用,但用户的主要需求是编码解码,所以这部分可以放在后面或者注意事项里。 需要确保代码示例正确,比如在编码时使用quote,处理查询参数使用urlencode,解码使用unquoteparse_qs。同时,注意中文字符的处理,确保示例中的字符串能正确展示编码后的结果,比如“Python 教程”编码后变成“Python%20%E6%95%99%E7%A8%8B”。 另外,用户可能对参数中的特殊字符处理有疑问,比如&=在查询字符串中的编码,需要说明urlencode会自动处理这些。同时,提到keep_blank_valuesstrict_parsing参数的作用,如引用[3]中的parse_qsl的参数,可以解释这些参数的使用场景。 最后,总结不同方法的适用场景,帮助用户选择正确的函数。可能还需要提醒用户注意编码的一致性,比如在拼接URL时使用urljoin确保正确的基准路径,避免相对路径的问题,如引用[5]中的例子。 检查是否有遗漏的部分,比如错误处理,如编码时可能遇到的类型错误,或者解码时的异常情况。同时,确保所有引用资料中的信息都被合理利用,但不过度引用,保持回答的简洁针对性。 现在,将这些思考整理成一个结构化的回答,分步骤讲解编码解码的方法,提供示例代码,并加入注意事项常见问题,最后生成相关问题供用户深入探讨。</think>### 如何在 Python 中使用 `urllib.parse` 实现 URL 编码解码 Python 的 `urllib.parse` 模块提供了一系列工具,专门用于 URL编码解码结构化处理。以下是具体的实现方法示例代码: --- #### 1. **URL 编码:将特殊字符转为百分号编码** - **场景**:将字符串中的空格、中文等字符转为 `%20`、`%E6%95%99` 等格式。 - **核心函数**:`urllib.parse.quote()` ```python from urllib.parse import quote original_str = "Python 教程 & 案例" encoded_str = quote(original_str, safe="") # safe="" 表示不保留任何字符(默认保留字母数字_-.) print(encoded_str) # 输出:Python%20%E6%95%99%E7%A8%8B%20%26%20%E6%A1%88%E4%BE%8B ``` - **参数说明**: - `safe`:指定不编码的字符(例如 `safe="/:"` 保留斜杠冒号)。 - `encoding`:默认 `utf-8`,可指定其他编码格式(如 `gbk`)。 --- #### 2. **URL 解码:还原百分号编码** - **场景**:将 `%20`、`%E6%95%99` 等编码还原为原始字符。 - **核心函数**:`urllib.parse.unquote()` ```python from urllib.parse import unquote encoded_str = "Python%20%E6%95%99%E7%A8%8B%20%26%20%E6%A1%88%E4%BE%8B" decoded_str = unquote(encoded_str) print(decoded_str) # 输出:Python 教程 & 案例 ``` --- #### 3. **查询参数编码(字典 → URL 字符串)** - **场景**:将字典参数转为 `key=value&...` 格式,并自动编码特殊字符。 - **核心函数**:`urllib.parse.urlencode()` ```python from urllib.parse import urlencode params = { "name": "张三", "page": 2, "query": "Python & 数据分析" } encoded_params = urlencode(params) print(encoded_params) # 输出:name=%E5%BC%A0%E4%B8%89&page=2&query=Python+%26+%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90 ``` - **参数说明**: - `doseq=True`:处理值为列表的字段(如 `{"key": [1,2]}` → `key=1&key=2`)。 - `safe=":"`:指定保留不编码的字符。 --- #### 4. **查询参数解码URL 字符串 → 字典)** - **场景**:解析 `name=张三&page=2` 格式的字符串为字典。 - **核心函数**:`urllib.parse.parse_qs()` 或 `parse_qsl()`[^3] ```python from urllib.parse import parse_qs, parse_qsl query_str = "name=%E5%BC%A0%E4%B8%89&page=2&query=Python+%26+%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90" # 转为字典(自动处理重复键) params_dict = parse_qs(query_str) print(params_dict) # 输出:{&#39;name&#39;: [&#39;张三&#39;], &#39;page&#39;: [&#39;2&#39;], &#39;query&#39;: [&#39;Python & 数据分析&#39;]} # 转为键值对列表 params_list = parse_qsl(query_str) print(params_list) # 输出:[(&#39;name&#39;, &#39;张三&#39;), (&#39;page&#39;, &#39;2&#39;), (&#39;query&#39;, &#39;Python & 数据分析&#39;)] ``` --- #### 5. **构建完整 URL** - **场景**:拼接基准 URL 相对路径,确保路径合法性。 - **核心函数**:`urllib.parse.urljoin()`[^5] ```python from urllib.parse import urljoin base_url = "http://example.com/docs/" relative_path = "../api#section-2" full_url = urljoin(base_url, relative_path) print(full_url) # 输出:http://example.com/api#section-2 ``` --- #### 注意事项 1. **编码一致性** - 编码(`quote`)解码(`unquote`)需使用相同的字符编码(默认 `utf-8`)。 - 若服务端使用 `gbk`,需显式指定:`quote(s, encoding=&#39;gbk&#39;)`。 2. **空格编码差异** - `quote` 默认将空格转为 `%20`,而 `urlencode` 转为 `+`。 - 可通过参数统一处理:`quote(s, safe="")` 或 `urlencode(params, quote_via=quote)`。 3. **处理异常字符** - 避免直接拼接 URL,优先使用 `urlencode` `urljoin` 防止格式错误[^5]。 --- ### 总结 | 功能 | 函数 | 典型应用场景 | |---------------------|------------------------|----------------------------------| | 单字符串编码 | `quote()` | 编码 URL 路径或参数值 | | 单字符串解码 | `unquote()` | 解码 URL 中的百分号编码 | | 查询参数字典编码 | `urlencode()` | 构建 GET 请求的查询字符串 | | 查询字符串解析 | `parse_qs()`/`parse_qsl()` | 解析 URL 中的查询参数 | | URL 安全拼接 | `urljoin()` | 合并基准 URL 相对路径 | --- --相关问题--: 1. 如何将 URL 中的加号 `+` 正确解码为空格? 2. 为什么 `urlencode` `quote` 对空格的处理方式不同? 3. 如何解析包含嵌套结构的复杂查询参数(如 JSON 格式)? 4. 在 RESTful API 中,`urljoin` 如何避免路径拼接错误?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值