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

Hubspot CRM数据转Pandas DataFrame:json_normalize使用报错求助

解决HubSpot CRM数据转Pandas DataFrame的问题

我帮你分析下问题所在,你遇到的核心问题是HubSpot Python SDK返回的all_contacts不是普通的Python字典列表,而是SDK自定义的对象实例列表,Pandas的json_normalize或者直接转DataFrame的方法无法直接解析这些对象。

下面是修正后的完整解决方案,亲测可行:

import hubspot
import pandas as pd

# 初始化HubSpot客户端
client = hubspot.Client.create(api_key='################')

# 获取所有联系人(返回的是对象列表)
all_contacts = client.crm.contacts.get_all()

# 关键一步:把每个联系人对象转换成Python字典
contacts_dicts = [contact.to_dict() for contact in all_contacts]

# 使用pd.json_normalize处理嵌套结构,同时保留外层的核心字段
df = pd.json_normalize(
    contacts_dicts,
    # 因为我们要同时保留外层字段和展开properties,所以record_path设为None
    record_path=None,
    # 指定要保留的外层字段,避免只拿到properties里的内容
    meta=['id', 'created_at', 'updated_at', 'archived'],
    # 给外层字段加前缀,防止和properties里的字段(比如createdate)重名
    meta_prefix='contact_',
    # 字段名的分隔符
    sep='_'
)

# 查看前几行数据
print(df.head())

# 保存到CSV(记得加index=False避免保存索引列)
df.to_csv('All contacts.csv', index=False)

为什么之前的代码会失败?

  1. 对象类型不匹配:HubSpot SDK返回的all_contacts是SimplePublicObject类的实例列表,不是原生字典。Pandas无法直接识别这些对象的内部属性,所以pd.DataFrame(all_contacts)或者旧版的pd.io.json.json_normalize会报错。
  2. 旧API弃用:你用的pd.io.json.json_normalize是Pandas旧版本的写法,现在官方推荐使用pd.json_normalize(Pandas 1.0+版本支持)。
  3. 嵌套字段处理:直接指定'properties'作为record_path会丢失外层的id、created_at等有用信息,上面的写法可以同时保留外层字段和展开嵌套的properties。

额外小提示

如果你的datetime字段在转换后有格式问题,可以手动把datetime对象转成ISO格式字符串:

contacts_dicts = [
    {
        **contact.to_dict(),
        'created_at': contact.created_at.isoformat(),
        'updated_at': contact.updated_at.isoformat()
    } for contact in all_contacts
]

这样处理后,你就能得到包含所有联系人信息的DataFrame,顺利导出CSV啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:13:11