Питон, vobject, кодирование, vcards

Я использую 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с использованием различных кодировок и т. Но я всегда получаю одно и то же или очень похожее сообщение об ошибке.

Любые идеи о том, как это исправить?

3 ответа

Решение

Это терпит неудачу на линии 13 vCard, потому что ADR свойство неправильно помечено как закодированное в кодировке "quoted-printable". ü символ должен быть закодирован как =FCвот почему vobject выдает ошибку.

vobject библиотека readOne метод довольно неловко

Чтобы избежать проблем, я решил сохранить в своей базе данных визитные карточки в виде данных для печати в кавычках, которые нравятся одному.

при условии, some_vcard строка с кодировкой UTF-8

quopried_vcard = quopri.encodestring(some_vcard)

и quopried_vcard сохраняется, а при необходимости просто:

vobj = vobject.readOne(quopried_vcard)

а затем вернуть обратно декодированные данные, например, для fn поле в vcard:

quopri.decodestring(vobj.fn.value)

Может быть, кто-то может справиться с UTF-8 с readOne лучше. Если да, я хотел бы увидеть это.

Файл загружается как строка в кодировке UTF-8 (я думаю), но библиотека пытается интерпретировать его как ASCII.

Попробуйте добавить следующую строку после urlopen:

vcard = vcard.decode('utf-8')
Другие вопросы по тегам