Хотя я согласен с Лоуренсом, бывают случаи, когда быстрый и грязный 99% -ный подход делает работу без создания других проблем.
Вот пример, демонстрирующий подход на основе регулярных выражений -
import re
CLEANBODY_RE = re.compile(r'<(/?)(.+?)>', re.M)
def _repl(match):
tag = match.group(2).split(' ')[0]
if tag == 'p':
return '<%sp>' % match.group(1)
elif tag in ('a', 'br', 'ul', 'li', 'b', 'strong', 'em', 'i'):
return match.group(0)
return u''
def cleanbody(html):
return CLEANBODY_RE.sub(_repl, html)