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

Python3存储Facebook公开数据至数据库遇乱码问题求助

解决Facebook数据存入数据库乱码的问题

嘿,我看你遇到了把Facebook公开数据存数据库时出现乱码的问题,咱们来一步步搞定它!

问题根源

你用urllib.request.urlopen(url).read()获取到的是字节对象(bytes),比如b'"John Doe"'这种格式。Python的pprint打印时会帮你处理成易读的样子,但直接把这个字节对象插入数据库,就会被存成b'...'这种你看到的“乱码”格式——本质上这不是乱码,是字节对象的原始表示,不是我们需要的字符串内容。

修复步骤

1. 把字节数据解码为字符串(推荐用JSON解析)

Facebook Graph API返回的是JSON格式的数据,我们可以直接用json模块解析成Python字典,再提取需要的字段,这样拿到的就是纯字符串了:

import json
import urllib.parse
import urllib.request

# 一次请求获取用户id和name
params = urllib.parse.urlencode({
    "fields": 'id,name',
    "access_token": ACCESS_TOKEN
})
url = "{host}{path}?{params}".format(host=host, path=path, params=params)
response = urllib.request.urlopen(url).read()
# 解析JSON数据为字典
user_data = json.loads(response)
uId = user_data['id']
uName = user_data['name']

2. 简化请求逻辑(可选但推荐)

你原来分三次请求获取不同字段,其实可以一次请求拿到所有需要的字段,既减少API调用次数,也避免重复代码。

3. 确认数据库字段类型

确保你的数据库表中NAME和STRING字段是字符串类型(比如MySQL的VARCHAR/TEXT,PostgreSQL的TEXT),不要用二进制类型(比如BLOB),这样字符串才能正确存储。

4. 数据库连接指定UTF-8编码(可选)

如果你的数据包含非英文字符(比如中文、emoji),建议在数据库连接时指定UTF-8编码,比如MySQL连接时加上charset=utf8mb4,确保特殊字符能正确存储。

修改后的完整代码片段

host = "https://graph.facebook.com/v3.0"
path = "/me"
import json
import urllib.parse
import urllib.request

# 一次请求获取id和name
params = urllib.parse.urlencode({
    "fields": 'id,name',
    "access_token": ACCESS_TOKEN
})
url = "{host}{path}?{params}".format(host=host, path=path, params=params)
response = urllib.request.urlopen(url).read()
user_data = json.loads(response)
uId = user_data['id']
uName = user_data['name']

# 插入数据库(假设temp_id, age, address, salary变量已定义)
cur.execute("""
INSERT INTO COMPANY(ID, NAME, AGE, ADDRESS, SALARY, STRING)
VALUES(%s, %s, %s, %s, %s, %s)
""", (temp_id, uName, age, address, salary, uId))
conn.commit()
conn.close()

这样处理后,存入数据库的就是正常的字符串,不会再出现b'...'的格式啦!

内容的提问来源于stack exchange,提问作者Karos papermoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:56:22