使用 python vobject 获取 vcard 中属性的所有值



如果我导入带有 vobject 的电子名片,如下所示:

with open(some_file_containing_a_vcard,
                  "r" , encoding="utf-8") as fd:
            vcard_content = vobject.readOne(fd.read(),
                                            ignoreUnreadable=True)

如果电子名片提供了多个电话号码或电子邮件,我如何获得所有电话号码或电子邮件?

我只发现:

vcard_content.tel.value
vcard_content.email.value

。但这只返回每个中的第一个。

当我深入研究代码时,实体似乎是作为分支创建的。因此,电子名片的属性"TEL"被创建为"tel"。如果我有手机和工作电话号码怎么办?

我完全被困住了:-)

实际上,您可以使用 contents 属性(字典)来实现此目的。因此,您将使用类似以下内容访问所有TEL属性的列表

with open(path_to_vcard) as f:
    text = f.read()
card = vobject.readOne(text)
print card.contents['tel']

这将打印所有 TEL 属性的列表(即使只有一个或没有)。

我用以下代码片段解决了它:

stream = io.open(some_file_containing_a_vcard, "r", encoding="utf-8")
vcf = vobject.readComponents(stream, ignoreUnreadable=True)
for child in vcard.getChildren():
    name = child.name.lower()
    value = child.value
    attribs = child.params.get("TYPE", [])
    filtered_type = [x.lower() for x in attribs if x.lower() in (
                        "work", "home", "cell", "fax"
                    )]
    if len(filtered_type) == 0:
        filtered_type = ["unspec"]
    # Do something with it... i.e. adding to a dict()
stream.close()

这对我有用:-)

有名为 tel_listemail_list 的属性应该提供您要查找的其他条目。

这些列表中的元素就像"tel"和"email"一样,每个元素都有一个.value.type_param,您可能需要检查这些元素以消除歧义。

最新更新