[每日一氵] 网址链接中的%xx——URL编码如何处理

写爬虫的时候遇到的,顺便记录一下


有时候我们从网址上复制一些网址,网址后边的汉字,非数字/字母的字符会变成如下的形式

%7B%22uid%22%3A%22%22%2C%22keyword%22%3A%22%E9%87%91%E7
%A7%91%E8%82%A1%E4%BB%BD%22%2C%22type%22%3A%5B%22gubaArticleWeb
%22%5D%2C%22client%22%3A%22web%22%2C%22clientVersion%22%3A%22curr
%22%2C%22clientType%22%3A%22web%22%2C%22param%22%3A%7B%22
gubaArticleWeb%22%3A%7B%22pageSize%22%3A10%2C%22pageIndex%22
%3A1%2C%22postTag%22%3A%22%22%2C%22preTag%22%3A%22%22%2C
%22sortOrder%22%3A2%7D%7D%7D

尽管我们知道

# %22
>>> chr(0x22)
'"'

# %3A
>>> chr(0x3A)
':'

# %2C
>>> chr(0x2C)
','

可以通过一个简单的python脚本来恢复原来的内容,但是中文比较难处理,用的是 URL编码(也被称为百分比编码)

我个菜鸡今天才知道 urllib.parse.unquote

urllib.parse.unquote 是 Python 标准库中 urllib.parse 模块的一个函数,它的作用是将 URL 的百分比编码字符串转换回其原始形式。换句话说,它解码了 %xx 形式的ASCII字符表示回到它们对应的字符。


使用 urllib.parse.unquote 的基本语法如下:

urllib.parse.unquote(string, encoding='utf-8', errors='replace')
  • string: 要解码的URL百分比编码的字符串。
  • encoding: 用于解码的编码类型,默认是 ‘utf-8’。这意味着解码过程会按照UTF-8编码进行。
  • errors: 指定如何处理解码过程中遇到的错误。默认值是 ‘replace’,这意味着在解码遇到任何错误时会用一个替代字符(通常是�)来替换。其他可能的值包括 ‘ignore’ 忽略错误和 ‘strict’ 直接抛出 UnicodeDecodeError 异常。

因此,上边的那串奇怪的字符,可以转化为

>>> temp_param_str = "%7B%22uid%22%3A%22%22%2C%22keyword%22%3A%22%E9%87%91%E7%A7%91%E8%82%A1%E4%BB%BD%22%2C%22type%22%3A%5B%22gubaArticleWeb%22%5D%2C%22client%22%3A%22web%22%2C%22clientVersion%22%3A%22curr%22%2C%22clientType%22%3A%22web%22%2C%22param%22%3A%7B%22gubaArticleWeb%22%3A%7B%22pageSize%22%3A10%2C%22pageIndex%22%3A1%2C%22postTag%22%3A%22%22%2C%22preTag%22%3A%22%22%2C%22sortOrder%22%3A2%7D%7D%7D"

>>> # 使用urllib.parse.unquote来解码URL编码的字符串
>>> decoded_string = urllib.parse.unquote(temp_param_str)
>>> decoded_string 
'{"uid":"","keyword":"金xxx","type":["gubaArticleWeb"],"client":"web","clientVersion":"curr","clientType":"web","param":{"gubaArticleWeb":{"pageSize":10,"pageIndex":1,"postTag":"","preTag":"","sortOrder":2}}}'

可以看到是一个字典字符串,可以用 json.dumps 来,转换给Python的字典对象

>>> json.loads( decoded_string )
>>> pprint(json.loads( decoded_string ))
{'client': 'web',
 'clientType': 'web',
 'clientVersion': 'curr',
 'keyword': '金xxx',
 'param': {'gubaArticleWeb': {'pageIndex': 1,
                              'pageSize': 10,
                              'postTag': '',
                              'preTag': '',
                              'sortOrder': 2}},
 'type': ['gubaArticleWeb'],
 'uid': ''}

将这个字典修改后,可以使用 dumps 再转换为字符串形式,注意要删除其中空格 ,所以需要.replace删除

之后再使用 urllib.parse.quote 将字符串进行URL编码。这通常是为了确保URL中的字符串是有效的HTTP URL的一部分,将空格、特殊字符以及非ASCII文本转换为百分比编码(%xx格式)。

json_info_dict_str = json.dumps(json_info_dict).replace(" ", "")

json_info_dict_str_quoted = urllib.parse.quote(json_info_dict_str)

使用 urllib.parse.quote 的基本语法如下:

urllib.parse.quote(string, safe='/', encoding=None, errors=None)
  • string: 要进行编码的字符串。
  • safe: 指定哪些字符不应该被编码。默认情况下,/ 是安全的,不会被编码,因为它常用于URL的路径部分。
  • encoding: 用于编码的编码类型。如果未指定或为 None,则使用 utf-8 编码。
  • errors: 指定如何处理编码过程中遇到的错误。如果未指定或为 None,将使用Python的标准错误处理策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值