如果我使用vobject导入一个vcard,如下所示:
with open(some_file_containing_a_vcard,
"r" , encoding="utf-8") as fd:
vcard_content = vobject.readOne(fd.read(),
ignoreUnreadable=True)如果vcard提供了多个电话号码或电子邮件,我如何获得所有电话号码或电子邮件?
我只找到了:
vcard_content.tel.value
vcard_content.email.value...but这只返回其中的第一个。
当我深入研究代码时,似乎实体是作为类创建的。因此,vcard的属性"tel“被创建为"TEL”。如果我有一个手机和一个工作电话号码?
我完全卡住了:-)
发布于 2017-06-23 06:29:37
您实际上可以通过使用contents属性来实现这一点,该属性是一个字典。因此,您可以使用下面的命令访问所有TEL属性的列表
with open(path_to_vcard) as f:
text = f.read()
card = vobject.readOne(text)
print card.contents['tel']它将打印所有TEL属性的列表(即使只有一个或没有)。
发布于 2017-02-02 05:46:21
我用下面的代码片段解决了这个问题:
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()这对我很有效:-)
发布于 2021-08-17 06:37:11
名为tel_list和email_list的属性应该可以提供您正在查找的其他条目。
这些列表中的元素的行为类似于"tel“和"email",并且每个元素都有一个您可能想要检查以消除歧义的.value和.type_param。
https://stackoverflow.com/questions/41976013
复制相似问题