写爬虫的时候遇到的,顺便记录一下
有时候我们从网址上复制一些网址,网址后边的汉字,非数字/字母的字符会变成如下的形式
%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的标准错误处理策略。