网页爬虫保存图片时文件名编码异常,是否有更简便的处理方法?
关于网页爬虫保存文件时文件名百分号编码的解决方案
这是什么编码规则
你遇到的是URL百分号编码,是互联网传输中处理非ASCII字符、特殊保留字符的通用标准规则:字符会先按UTF-8编码转为字节,每个字节再转换为%加两位十六进制数的格式。你观察到的é转成%c3%a9就是完全符合标准的UTF-8 URL编码结果,不是异常乱码。
现有实现的问题
你当前的链式replace写法有三个明显缺陷:
- 需要手动穷举所有特殊字符,容易遗漏生僻字符
- 替换顺序不当很容易出现二次转义的bug(比如你代码中反复替换
+和%2b,逻辑极易混乱) - 维护成本极高,新增规则需要手动加replace链
更简单的实现方式
Python标准库urllib.parse已经内置了成熟的编码/解码函数,不需要手动实现字符映射,配合你自定义的清洗规则即可:
from urllib.parse import quote, unquote def unify_filename(string): # 1. 基础清洗:统一小写、去除首尾空白 res = string.lower().strip() # 2. 处理需要直接删除的字符,统一管理规则 remove_patterns = {'~', "'", '’', '%27', '%7e'} for pattern in remove_patterns: res = res.replace(pattern, '') # 3. 标准UTF-8 URL编码,safe参数指定不需要编码的字符 # 这里把@加入safe列表,就不会把@编码为%40,符合你原来的逻辑 res = quote(res, safe='@') # 4. 处理自定义替换规则,用字典统一管理更清晰 custom_replace = { '%2b': ' ', ' ': ' ' } for old, new in custom_replace.items(): res = res.replace(old, new) return res
如果你的需求是把已经编码的文件名还原为正常字符,直接调用unquote即可:
# 示例:把编码后的文件名还原 print(unquote('%c3%a9%20photo.png')) # 输出:é photo.png
内容的提问来源于stack exchange,提问作者Nicolas Gervais
相关产品推荐
相关产品推荐

