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 > x && y < 0' >>> htmlunescape(htmlescape("a > x && y < 0")) 'a > x && y < 0'
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
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() :).
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 :)
ou ainda:
import xml.sax.saxutils as saxutils
saxutils.escape(“&”)
‘&’
saxutils.unescape(“>”)
‘>’
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+;)’