我在python中使用vobject
。我正在尝试解析位于此处的vcard
:
http://www.mayerbrown.com/people/vCard.aspx?Attorney=1150
为此,我执行以下操作:
import urllib
import vobject
vcard = urllib.urlopen("http://www.mayerbrown.com/people/vCard.aspx?Attorney=1150").read()
vcard_object = vobject.readOne(vcard)
每当我这样做时,都会收到以下错误:
Traceback (most recent call last):
File "<pyshell#86>", line 1, in <module>
vobject.readOne(urllib.urlopen("http://www.mayerbrown.com/people/vCard.aspx?Attorney=1150").read())
File "C:\Python27\lib\site-packages\vobject-0.8.1c-py2.7.egg\vobject\base.py", line 1078, in readOne
ignoreUnreadable, allowQP).next()
File "C:\Python27\lib\site-packages\vobject-0.8.1c-py2.7.egg\vobject\base.py", line 1031, in readComponents
vline = textLineToContentLine(line, n)
File "C:\Python27\lib\site-packages\vobject-0.8.1c-py2.7.egg\vobject\base.py", line 888, in textLineToContentLine
return ContentLine(*parseLine(text, n), **{'encoded':True, 'lineNumber' : n})
File "C:\Python27\lib\site-packages\vobject-0.8.1c-py2.7.egg\vobject\base.py", line 262, in __init__
self.value = str(self.value).decode('quoted-printable')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 29: ordinal not in range(128)
我在此尝试了许多其他变体,例如将vcard
转换为unicode
,使用各种编码等。但我总是得到相同或非常相似的错误信息。
有关如何解决此问题的任何想法?
答案 0 :(得分:2)
它在vCard的第13行失败,因为ADR
属性被错误地标记为以“quoted-printable”编码进行编码。 ü
字符应编码为=FC
,这就是vobject
抛出错误的原因。
答案 1 :(得分:0)
文件以UTF-8(我认为)编码的字符串下载,但库试图将其解释为ASCII。
尝试在urlopen之后添加以下行:
vcard = vcard.decode('utf-8')
答案 2 :(得分:0)
vobject
库readOne
方法非常尴尬。
为了避免出现问题,我决定在我的数据库中以引用的可打印数据的形式保存vcards,这是人们喜欢的。
假设some_vcard
是带有UTF-8编码的字符串
quopried_vcard = quopri.encodestring(some_vcard)
并且quopried_vcard
会被持久化,只需要:
vobj = vobject.readOne(quopried_vcard)
然后返回解码数据,例如vcard中的fn
字段:
quopri.decodestring(vobj.fn.value)
也许有人可以更好地处理带有readOne的UTF-8。如果是的话,我很乐意看到它。