2012-05-22 5 views
0

Я пытался решить проблему, с которой я столкнулся в течение двух дней.Проблемы с python, xmlrpc, tidy и unicode

Конечная цель - перенести содержимое сервера вики-файлов на ящик foswiki/twiki.

Я нашел таблицу стилей xslt, которая выполняет большую часть работы, и делает это достаточно хорошо и быстро. Все, что мне нужно сделать, чтобы использовать его, - это прокормить его хорошо сформированный (X) HTML, в котором находится аккуратная строка «content» в структуре данных wiki для Apple, в ней много HTML-тегов, но она неполна.

Использование интроспекции xmlrpc, не документированный API-интерфейс apple, практически можно использовать с несколькими подсказками, разбросанными на форумах Apple.

Попытка использовать опрятный теперь дает мне:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 121: ordinal not in range(128) 

Очевидно, что я искал это сообщение об ошибке, и нашел несколько статей, в том числе некоторые здесь на Stackoverflow, но они, кажется, предполагают, что что это проблема кодирования из терминал, который я использую. Однако LANG = en_US.UTF-8 здесь, поэтому это не может быть причиной моей проблемы.

я нашел статью, в которой предложил избавиться от BOM, но при этом я создал новое сообщение об ошибке, что сделал так же мало смысла для меня:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128) 

Вот соответствующий код-фрагмент:

pages = {} 

paths = s.groupsForSession(session_id) # paths is a list of groups that user can read on that server 
for aPath in paths: 
    entries = s.wiki.getEntries(session_id, aPath) 
    # entries = s.search.getEntries(session_id, aPath) 
    pprint.pprint(entries) 

    for uid in entries: 
    try: 
     entry = s.wiki.getEntryWithUID(session_id, uid['uid']) 
    except Exception, e: 
     print e.faultString 
     raise Exception 
    pages[uid['uid']] = entry 
    pprint.pprint( pages[uid['uid']]['content']) 
    print(
     tidy.parseString(
     str(
      unicode(
       pages[uid['uid']]['content'].strip(codecs.BOM_UTF8), 'utf-8' 
     ) 
     ), 
     **options 
     ) 
    ) 
+0

* вздох * Мы все знаем знаменитого медведя, правда? Еще несколько экспериментов позже я получаю то, что хочу; похоже, что сообщения о проблемах с кодировкой заставили меня лаять неправильное дерево. решение проблемы было довольно простым. 'tidy.parseString ( ул (страницы [UID [ 'UID']] [ 'содержание']. закодировать ('UTF-8') ), ** опции ) ' – tink

+0

FYI, 'ул()' не требуется. Результатом 'encode()' является 'str'. –

+0

Thanks Mark - у меня все еще есть крутая кривая обучения впереди меня с python;) – tink

ответ

0

Как было предложено @oefe:

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

tidy.parseString(str(pages[uid['uid']]['content'].encode('utf-8')), **options) 
Смежные вопросы