punycode 编码又称 域名代码,是实现 中文汉字转英文字母 的一种编码方式
import re
url = 'www.示例.com'
# 正则匹配中文汉字
list_cn = re.findall('[\u4e00-\u9fa5]+', url)
# 遍历进行 punycode 编码
list_puny = list(map(lambda x: 'xn--' + x.encode('punycode').decode('utf-8'), list_cn))
# 对原 url 进行替换
for cn, puny in zip(list_cn, list_puny): url = url[:url.find(cn)] + puny + url[url.find(cn) + len(cn):]
print(url)
# www.xn--fsq092h.com
import re
url = 'www.xn--fsq092h.com'
# 正则匹配 punycode 编码
list_puny = re.findall('xn--(\w*)', url)
# 遍历进行 punycode 解码
list_cn = list(map(lambda x: x.encode('utf-8').decode('punycode'), list_puny))
# 对原 url 进行替换
for puny, cn in zip(list_puny, list_cn): url = url[:url.find(puny) - 4] + cn + url[url.find(puny) + len(puny):]
print(url)
# www.示例.com
之所以推荐该种编码方式,是因为python3的requests模块无法很好的识别中文url编码,导致域名无法访问;其次,谷歌浏览器也是使用的这种编码方式。
from urllib.parse import quote
import string
url = 'www.示例.com'
url = quote(url, safe = string.printable) # safe 表示可以忽略的字符,数字大小写字母特殊字符等
print(url)
# www.%E7%A4%BA%E4%BE%8B.com
from urllib.parse import unquote
url = 'www.%E7%A4%BA%E4%BE%8B.com'
url = unquote(url, encoding='utf-8') # encoding 表示编码,可为 GBK 或 utf-8
print(url)
# www.示例.com