Кодировать символы Юникода в объекты HTML в Python, за исключением тегов

Как вы, возможно, знаете, для того, чтобы электронное письмо было действительным во многих клиентах, все символы Юникода должны быть закодированы. Я хотел бы автоматизировать эту кодировку в скрипте Python.

Очевидно, что теги должны быть исключены из преобразования, иначе html не будет работать - сделать это действительно сложно - чтобы быть уверенным в успехе, необходимо использовать пакет для синтаксического анализа, такой как lxml или BeautifulSoup.

Насколько мне известно, ни один из этих двух пакетов не поддерживает преобразование в нумерованные сущности Unicode, такие как & #x6F22 ; (漢)

Любая помощь будет действительно неоценимой, я весь день бился головой об эту стену!


person Humfrey    schedule 27.08.2011    source источник
comment
Я не эксперт в этих вопросах, но вы, вероятно, найдете здесь что-то полезное: stackoverflow.com/questions/629999/   -  person machine yearning    schedule 28.08.2011
comment
Убедитесь, что вы указали UTF-8 в заголовках.   -  person Mechanical snail    schedule 28.08.2011


Ответы (2)


У меня была похожая проблема, однако всегда было достаточно выполнить следующее выражение для необработанного текста, которое просто преобразует шестнадцатеричные объекты в десятичные, которые затем анализируются очень хорошо:

>>> hex_entity_pat = re.compile('&#x([^;]+);')
>>> hex_entity_fix = lambda x: hex_entity_pat.sub(lambda m: '&#%d;' % int(m.group(1), 16), x) # convert hex to dec entities
>>> BeautifulSoup(hex_entity_fix("<b>&#x6F22;</b>"), convertEntities=BeautifulSoup.ALL_ENTITIES)
<b>漢</b>
person rumpel    schedule 18.09.2011

Я предполагаю, что ваши электронные письма в HTML, а не в обычном тексте. Я думаю, вы ищете это:

some_unicode_string.encode('ascii', errors='xmlcharrefreplace')

Но, может быть, вы можете сделать это по-другому. Как вы генерируете HTML в первую очередь?

person Simon Sapin    schedule 28.07.2012