Проблемы с питоном, xmlrpc, аккуратностью и юникодом
Я пытался обойти проблему, с которой я сталкиваюсь уже два дня.
Конечная цель - перенести содержимое сервера apple wiki в разметку foswiki / twiki.
Я нашел таблицу стилей xslt, которая выполняет большую часть работы, и делает это достаточно хорошо и быстро. Все, что мне нужно сделать, чтобы использовать его, это кормить его правильно сформированным (X)HTML, в который входит приборка - строка "содержимого" структуры данных Apple wiki содержит множество тегов HTML, но она неполна.
С помощью интроспекции xmlrpc недокументированный API Apple становится практически пригодным для использования с несколькими подсказками, разбросанными по яблочным форумам.
Попытка использовать приборку теперь дает мне:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 121: ordinal not in range(128)
Очевидно, я искал это сообщение об ошибке и нашел несколько статей, в том числе и здесь, на Stackru, но они, похоже, предполагают, что это проблема кодирования терминала, который я использую. Однако LANG=en_US.UTF-8 здесь, так что это не может быть причиной моей проблемы.
Я нашел статью, в которой предлагалось избавиться от спецификации, но при этом я создал новое сообщение об ошибке, которое не имело для меня никакого смысла:
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
)
)
1 ответ
По предложению @oefe:
Через несколько экспериментов я получаю то, что хочу; Похоже, сообщения о проблемах кодирования заставили меня заколдовать не то дерево. Решение проблемы было довольно простым.
tidy.parseString( str( pages[uid['uid']]['content'].encode('utf-8') ), **options )