python - 在复杂的 json 对象中查找 dict 键的值
问题描述
我已经为此工作了大约三天,并且尽我所能。我创建了一个脚本,该脚本使用 Google API 从 Gmail 下载单个邮件。我需要从该消息中提取收件人、抄送和密送地址并将它们存储在一个列表中。我最终需要处理大量消息,但我什至无法从一条消息中提取这些值。Gmail JSON 对象是 dict 和 list 对象的混合体:
msg (dict-8)
--historyID (str-1)
--id (str-1)
--internalDate (str-1)
--labelIds (list-1)
--payload (dict-2)
-- --headers (list-1)
-- -- --unnamed index 0 (dict-2)
-- -- -- --name:To (str-1)
-- -- -- --value:gself@gmail.com (str-1)
-- --mimeType (str-1)
--sizeEstimate (int-1)
--snippet (str-1)
--threadId (str-1)
对于我的项目,我需要“收件人”地址的值(我最终还需要抄送和密件抄送数据,但可以应用任何适用于“收件人”的内容来查找这些值)。早期的努力是通过使用“msg['payload']['headers'][0]['value']”之类的内容导航到该值来简单地提取该值。这对于这条消息来说效果很好,但 JSON 结构似乎不一致,并且标题列表中“To”的索引号是不可预测的。所以我需要找到一种方法来搜索所有 'name:To' 键并从该列表元素中提取值项。在这件事上我有点过头了。
我在各种包中尝试了几种不同的 JSON 函数,但没有运气。我看着 Pandas 并认为那里可能有一些希望,但我无法弄清楚。我尝试了一个简单的 REGEX 搜索,但我无法搜索 dict 对象。我尝试压平 dict 但这似乎并没有给我太多帮助(即使是平的,'To' 行也包含索引号,所以键有点不可预测)。我尝试了各种 for 循环,但发现很难遍历关卡。我尝试了几种在网上找到的不同迭代器,但它们似乎对我不起作用,尽管我怀疑我根本不知道自己在做什么。
我想出的唯一可能的解决方案是使用 json.dumps 将 dict 转储到一个变量中,然后对该变量中的电子邮件地址进行正则表达式搜索。虽然我认为这应该可行,但令我震惊的是,必须有一个比创建变量并在该变量中搜索更直接的解决方案。
是否有一个包可以帮助我从 Gmail JSON 对象的列表中提取隐藏元素(电子邮件地址)?也许我可以搜索出现在任何值中的电子邮件地址,但我不确定如何在结构中向下搜索三个级别。也许有人开发了一个可以搜索 JSON 对象的函数。也许还有另一种解决方案,我只是没有足够的经验来自己制作。我非常感谢我能得到的任何帮助。
解决方案
我想我找到了解决方案,并应为[mountain]=[molehill]向社区道歉。事实证明,JSON 对象中唯一改变的部分是“标题”列表的长度,我可以轻松浏览该列表并使用以下内容存储所有电子邮件地址:
for getAddr in msg['payload']['headers']:
msgAddr += (getAddr['value'])
三天问题的两行解决方案。现在我要溜回我的洞穴...
解决方案
推荐阅读
- javascript - 选中或取消选中复选框中的问题
- angular - 动态更改提供者
- pdf - Azure ML 决策树可视化下载
- javascript - 如何使用 gtag 在 Google Analytics 中跟踪 utm_source?
- sql - 使用 Objection.js 插入一组 UUID
- java - Kafka Java客户端处理连接,服务器问题
- python-3.x - 文件“quickstart.py”,第 9 行,在
- java - 是否可以在包含目标 + 连接字段的子类上使用 @JoinTable?
- java - 除了缓存指令之外,解释器生成的本机代码和 JIT 之间有什么区别吗?
- java - 活动在使用共享元素转换后闪烁