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)
为什么之前的代码会失败?
- 对象类型不匹配:HubSpot SDK返回的
all_contacts是SimplePublicObject类的实例列表,不是原生字典。Pandas无法直接识别这些对象的内部属性,所以pd.DataFrame(all_contacts)或者旧版的pd.io.json.json_normalize会报错。 - 旧API弃用:你用的
pd.io.json.json_normalize是Pandas旧版本的写法,现在官方推荐使用pd.json_normalize(Pandas 1.0+版本支持)。 - 嵌套字段处理:直接指定
'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
相关产品推荐
相关产品推荐

