Python: Escapar caracteres especiais em HTML (entities)

Palavras-chave: HTML, escape, escapar, html_escape, htmlspecialchars, htmlentities

Funcões rápidas para escapar e desescapar caracteres especiais HTML (<, & etc)

from htmlentitydefs import codepoint2name as cp2nm, entitydefs as nm2cp
import re

def htmlescape(texto):
    return "".join([cp2nm.has_key(ord(x)) and
                   "&%s;"%cp2nm[ord(x)] or x for x in texto])

def htmlunescape(texto):
    return "".join([(x.startswith("&") and
                     x.endswith(";") and
                     nm2cp.has_key(x[1:-1]))
                    and nm2cp[x[1:-1]] or x
                   for x in re.split('(&\\\\w+;)', texto)])

Exemplo:

>>> htmlescape("a > x && y < 0")
'a &gt; x &amp;&amp; y &lt; 0'
>>> htmlunescape(htmlescape("a > x && y < 0"))
'a > x && y < 0'

Veja esta dica em Ruby.

This entry was posted in Python. Bookmark the permalink.

5 Responses to Python: Escapar caracteres especiais em HTML (entities)

  1. Nilton Volpato says:

    Alfredo,

    Para fazer o unescape seria melhor um solução desse tipo:

    from htmlentitydefs import name2codepoint as n2cp
    import re

    entity_re = re.compile(‘&(#?)(\d{1,5}|\w{1,8});’)

    def substitute_entity(match):
    ent = match.group(2)
    if match.group(1) == ‘#’:
    return unichr(int(ent))
    else:
    cp = n2cp.get(ent)
    if cp:
    return unichr(cp)
    else:
    return match.group()

    def decode_htmlentities(string):
    return entity_re.subn(substitute_entity, string)[0]

    Esse código, a princípio pode retornar uma string unicode, o que é mais correto. Veja que ainda existe o caso &#número; que o seu código não trata. Veja:

    >>> htmlunescape(‘é ã Ã あ’)
    ‘\xe9 \xe3 \xc3 あ’

    Já esse código:

    >>> decode_htmlentities(‘é ã Ã あ’)
    u’\xe9 \xe3 \xc3 \u3042′

    Não testei, mas acho também que essa versão usando re.subn é bem mais eficiente do que fazer um re.split e depois concatenar novamente.

    Abraços,
    — Nilton

  2. chronos says:

    tem algo como get_html_translation_table do php em python?

    ele retorna em php um array associando ‘ç’ => ‘&ccdil;’ por exemplo.

    com isso fica fácil pq ai é um S.replace() :).

  3. Estava olhando a documentação do python e aqui

    http://docs.python.org/lib/node563.html

    Mostra que dentro do módulo cgi existe uma função escape para fazer isso. Só não achei uma unescape :)

  4. ou ainda:

    import xml.sax.saxutils as saxutils

    saxutils.escape(“&”)
    ‘&’

    saxutils.unescape(“>”)
    ‘>’

  5. Sabir says:

    Oi Nilton,
    muito legal o seu tutorial :)

    Mas na última linha da função htmlunescape acho que você quiz dizer ‘(&\\w+;)’ em vez de ‘(&\\\\w+;)’

Comments are closed.