python, vobject, encoding, vcards



我在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:Python27libsite-packagesvobject-0.8.1c-py2.7.eggvobjectbase.py", line 1078, in readOne
    ignoreUnreadable, allowQP).next()
  File "C:Python27libsite-packagesvobject-0.8.1c-py2.7.eggvobjectbase.py", line 1031, in readComponents
    vline = textLineToContentLine(line, n)
  File "C:Python27libsite-packagesvobject-0.8.1c-py2.7.eggvobjectbase.py", line 888, in textLineToContentLine
    return ContentLine(*parseLine(text, n), **{'encoded':True, 'lineNumber' : n})
  File "C:Python27libsite-packagesvobject-0.8.1c-py2.7.eggvobjectbase.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。但是我总是得到相同的或非常相似的错误消息。

关于如何解决此问题的任何想法?

它在VCARD的第13行中失败,因为ADR属性错误地标记为在"引用可打印"的编码中编码。ü字符应编码为=FC,这就是vobject抛出错误的原因。

文件被下载为UTF-8(我认为)编码的字符串,但库试图将其解释为ASCII。

尝试在urlopen之后添加以下行:

vcard = vcard.decode('utf-8')

vobjectreadOne方法很尴尬。

为了避免问题,我决定以引用可打印数据的形式在我的数据库中持续存在,一个人喜欢。

假设some_vcard是带有UTF-8编码的字符串

quopried_vcard = quopri.encodestring(some_vcard)

quopried_vcard持续存在,并且仅在需要时:

vobj = vobject.readOne(quopried_vcard)

然后要返回解码数据,例如,vcard中的fn字段:

quopri.decodestring(vobj.fn.value)

也许有人可以更好地处理UTF-8,而ReadOne更好。如果是,我很想看到它。

最新更新