You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置(推荐,一劳永逸)

  1. 登录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;
  1. 修改Django项目settings.py中的数据库配置,指定连接字符集:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # 其余原有配置保持不变
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    }
}

修改完成后重启CPanel上的Python应用服务即可生效。

方案2:代码层过滤特殊字符(临时兼容,无需改数据库)

如果不方便修改数据库配置,可以在代码中过滤掉无法存储的特殊字符:

  1. 首先在views.py顶部导入正则模块:
import re
  1. 提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:54:01