Django+CPanel MySQL环境BeautifulSoup爬取feed报1366字符串错误如何解决
错误根因
该1366报错是MySQL字符集限制导致:报错信息里的\xE2\x80\x8E对应Unicode控制字符U+200E,属于4字节Unicode字符,MySQL默认的utf8(实际为utf8mb3)仅支持最大3字节的Unicode字符,所以会存储失败。SQLite、PostgreSQL的UTF8编码原生支持全长度Unicode,因此其他环境运行正常。
修复方案
方案1:修改MySQL配置(推荐,一劳永逸)
- 登录CPanel的phpMyAdmin,选中项目使用的数据库,依次执行以下SQL语句:
-- 修改数据库默认字符集 ALTER DATABASE 替换为你的数据库名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 修改Post表字符集 ALTER TABLE 替换为你的Post表表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 单独修改body字段字符集(如果标题也可能包含特殊字符可同步修改title字段) ALTER TABLE 替换为你的Post表表名 MODIFY COLUMN body LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 修改Django项目
settings.py中的数据库配置,指定连接字符集:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 其余原有配置保持不变 'OPTIONS': { 'charset': 'utf8mb4', }, } }
修改完成后重启CPanel上的Python应用服务即可生效。
方案2:代码层过滤特殊字符(临时兼容,无需改数据库)
如果不方便修改数据库配置,可以在代码中过滤掉无法存储的特殊字符:
- 首先在views.py顶部导入正则模块:
import re
- 提取body内容后增加过滤逻辑:
body = content[content.find('<p>'):] # 新增以下行过滤特殊字符 body = re.sub(r'[\x00-\x1F\x7F-\x9F\x{10000}-\x{10FFFF}]', '', body, flags=re.UNICODE)
额外优化建议
当前代码使用固定的temp_image.jpg作为临时文件,多个爬取任务同时运行时会出现文件冲突,可以改用Python内置的tempfile模块生成临时文件,避免并发错误。
内容的提问来源于stack exchange,提问作者penk
相关产品推荐
相关产品推荐

