必须显式指定encoding="utf-8",因Windows默认GBK编码无法写入UTF-8网页内容,否则触发UnicodeEncodeError;正确写法为with open("page.html", "w", encoding="utf-8") as f: f.write(html)。

用 open() 写入 HTML 字符串时编码必须显式指定为 "utf-8"
抓取的网页源码通常是 UTF-8 编码的字符串(比如用 requests.get(url).text),但 Python 默认用系统编码写文件,Windows 上常是 GBK,直接 open("page.html", "w").write(html) 会报 UnicodeEncodeError: 'gbk' codec can't encode character。
正确做法是强制指定编码:
with open("page.html", "w", encoding="utf-8") as f:
f.write(html)
- 不用
encoding参数 → Windows 下大概率崩溃 - 用
"wb"模式写入字节流?可以,但得先html.encode("utf-8"),多一步且易漏 - 文件后缀必须是
.html或.htm,否则双击打不开浏览器预览
用 requests.get().content 保存更稳妥,尤其含二进制内容或编码不明确时
有些网页响应头没声明 charset,.text 可能解码错误(比如把中文变成 ),而 .content 是原始字节,不会乱码。
这时应以二进制方式保存:
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
立即学习“Python免费学习笔记(深入)”;
resp = requests.get(url)
with open("page.html", "wb") as f:
f.write(resp.content)
-
.content适合保存原始响应体,兼容所有编码场景 - 不能用
"w"模式写.content,会报TypeError: write() argument must be str, not bytes - 如果后续要读取并解析,用
BeautifulSoup(open("page.html", "rb"), "lxml"),注意打开模式是"rb"
保存前建议检查 response.status_code 和 response.headers.get("content-type")
不是所有请求都成功返回 HTML —— 可能是 404、重定向、JSON 接口、甚至反爬返回的验证码页。盲目保存会导致文件内容无意义。
- 先判断
resp.status_code == 200,否则写个空文件或记录日志 - 检查
"text/html" in resp.headers.get("content-type", ""),避免把 PDF 或图片当成 HTML 保存 - 若
resp.url != url,说明发生了重定向,你保存的是跳转后页面,未必是你想要的
路径问题:相对路径在不同运行环境下行为不一致
写成 open("output/page.html", "w") 看似简单,但脚本被其他目录调用时,文件会生成在调用方当前路径,不是脚本所在目录。
- 用
os.path.join(os.path.dirname(__file__), "output", "page.html")明确基于脚本位置 - 或用
pathlib.Path(__file__).parent / "output" / "page.html"(更现代) - 目标目录不存在?
os.makedirs(os.path.dirname(path), exist_ok=True)提前创建
保存 HTML 文件本身很简单,难的是让每次保存都落到预期位置、编码不崩、内容不空——这三个点漏掉任何一个,调试时都得花十分钟找原因。


















