1

如果我像这样使用 vobject 导入 vcard:

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

...但这仅返回每个中的第一个。

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

我完全被困住了:-)

4

3 回答 3

2

您实际上可以通过使用contents属性(即字典)来实现这一点。因此,您可以使用类似的方式访问所有 TEL 属性的列表

with open(path_to_vcard) as f:
    text = f.read()

card = vobject.readOne(text)
print card.contents['tel']

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

于 2017-06-22T22:29:37.043 回答
1

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

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()

这对我有用:-)

于 2017-02-01T21:46:21.367 回答
0

有命名的属性tel_listemail_list应该提供您正在寻找的其他条目。

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

于 2021-08-17T06:37:10.647 回答