答我是基里安墨菲
你碰到的这个问题其实是因为网页源码里包含了 emoji 或一些特殊的 Unicode 字符,而在 Python 里处理、保存或者打印这些字符时,默认的编码(比如 utf-8)遇到“代理对(surrogates)”字符就会报错。
常见报错:
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position ...: surrogates not allowed
解决思路如下:
写文件时指定参数
保存源码到文件时,建议用 open(filename, "w", encoding="utf-8", errors="ignore"),加上 errors="ignore" 可以跳过不能编码的字符,比如:
python
RunCopy
with open("page.html", "w", encoding="utf-8", errors="ignore") as f:
f.write(html_content)
处理字符串时过滤或替换非法字符
可以用正则或者 encode/decode 方法过滤掉不能编码的字符。例如:
python
RunCopy
# 过滤掉不能被utf-8编码的字符
clean_html = html_content.encode("utf-8", "ignore").decode("utf-8", "ignore")
打印时也要注意编码问题
如果你直接 print(html_content),也可能遇到终端不支持 emoji 的情况。可以只保存、只处理,不打印。
如果是数据库写入,确保字段支持utf8mb4编码
有些数据库默认utf8格式不支持emoji,要用utf8mb4。
总结一句话:
遇到这种编码报错,核心就是加上 errors="ignore" 或 replace,或者用 encode/decode 跳过或替换掉“奇怪的”字符。这样 emoji 就不会让你的爬虫崩溃了。
对了,如果你在实际采集时总是遇到IP被封、数据不稳定等问题,也可以试试亮数据。亮数据专注于海外平台数据采集,提供网页抓取API、网页解锁器API、抓取浏览器和1.5亿+高质量住宅代理IP,帮你高效稳定地完成数据抓取。遇到采集难题可以关注下,让你的爬虫更顺畅!