Как преобразовать специальные символы в объекты html?

Я хочу преобразовать в python специальные символы, такие как "%$!&@á é ©", а не только '<&">', как показывает вся документация и ссылки, которые я нашел до сих пор. cgi.escape не решает проблему.

Например, строку "á ê ĩ &" следует преобразовать в "&aacute; &ecirc; &itilde; &amp;".

Кто-нибудь знает, как это решить? Я использую питон 2.6.


person Jayme Tosi Neto    schedule 08.03.2012    source источник
comment
Имейте в виду две вещи: (1) имена объектов могут вызвать проблемы, вместо этого вам, вероятно, следует использовать числовые объекты. (2) Зачем вообще использовать сущности? В большинстве случаев лучшим решением является кодировка документа в кодировке UTF-8, чтобы он мог содержать буквы, а не использовать сущности.   -  person Konrad Rudolph    schedule 08.03.2012
comment
wiki.python.org/moin/EscapingHtml   -  person Quentin    schedule 08.03.2012
comment
Я согласен с вами @KonradRudolph. Я не люблю использовать сущности, но система, в которой я работаю, их использует, так что у меня нет выбора. знак равно   -  person Jayme Tosi Neto    schedule 08.03.2012
comment
@Jayme Нет проблем, иногда у тебя нет выбора. Просто хотел убедиться, что вы знаете об этом.   -  person Konrad Rudolph    schedule 08.03.2012


Ответы (2)


Вы можете создать свой собственный цикл, используя словари, которые можно найти в http://docs.python.org/library/htmllib.html#module-htmlentitydefs

Тот, кого вы ищете, это htmlentitydefs.codepoint2name

person Ruben Vermeersch    schedule 08.03.2012
comment
Ссылка больше не работает. Вместо этого используйте HTMLParser в Python 2 и эквивалент html.parser в Python 3. - person oxidworks; 22.02.2017

Я нашел встроенное решение для поиска htmlentitydefs.codepoint2name, которое @Ruben Vermeersch сказал в своем ответе. Решение было найдено здесь: http://bytes.com/topic/python/answers/594350-convert-unicode-chars-html-entities

Вот функция:

def htmlescape(text):
    text = (text).decode('utf-8')

    from htmlentitydefs import codepoint2name
    d = dict((unichr(code), u'&%s;' % name) for code,name in codepoint2name.iteritems() if code!=38) # exclude "&"    
    if u"&" in text:
        text = text.replace(u"&", u"&amp;")
    for key, value in d.iteritems():
        if key in text:
            text = text.replace(key, value)
    return text

Спасибо всем за помощь! ;)

person Jayme Tosi Neto    schedule 08.03.2012