Проблемы с питоном, 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 )
Другие вопросы по тегам