为何HTML页面保存后文件大小总是比下载时多6字节?
问题原因分析及解决办法
核心问题:混淆了字符数和字节数
你踩了一个很容易忽略的坑:len(response.text)统计的是解码后Unicode字符串的字符数量,并非服务器返回的原始字节数。而Path(filepath).stat().st_size是文件的实际字节数,对应的是服务器返回的原始字节流大小(也就是len(response.content)的结果)。
如果你的测试页面里恰好有3个UTF-8编码的多字节字符(比如中文、特殊符号等,每个占3字节),那len(response.text)会比实际字节数少6(3*(3-1)=6),这就导致你看到固定差6字节的现象——10个页面都出现这个情况,说明这些页面的多字节字符数量刚好一致。
为什么curl下载也有同样问题?
如果是在Windows系统下用curl URL > file.html下载,命令行的重定向会自动把服务器返回的LF(\n)换行符转换成Windows的CRLF(\r\n),每个换行多1字节。要是页面正好有6个LF,文件大小就会比原始响应多6字节。不过结合你Python测试的情况,更可能还是字符数/字节数混淆的问题。
正确的做法
- 用
response.content获取原始字节数:
对比文件大小的时候,应该用len(response.content),而不是len(response.text),这才是服务器返回的真实字节数。 - 二进制模式保存文件:
要保证保存的文件和原始响应完全一致,用二进制模式写入response.content,避免编码和换行符转换:from pathlib import Path import requests URL = "你的目标URL" filepath = "保存的文件路径" response = requests.get(URL) response.raise_for_status() # 确保请求成功 # 检查是否需要保存 if not Path(filepath).exists() or Path(filepath).stat().st_size != len(response.content): with open(filepath, 'wb') as f: f.write(response.content)
内容的提问来源于stack exchange,提问作者snailontheslope
相关产品推荐
相关产品推荐

