Какой самый быстрый способ вырезать определенные HTML-теги в строке Python? - PullRequest
1 голос
/ 12 декабря 2010

Я бы хотел убрать все html / javascript, кроме:

<b></b>
<ul></ul>
<li></li>
<a></a>

Спасибо.

Ответы [ 3 ]

4 голосов
/ 12 декабря 2010

Хотите быстрый или правильный путь? Подход на основе регулярных выражений вряд ли будет правильным и может открыть вам до XSS атак.

Вы должны использовать HTML-парсер, такой как Beautiful Soup или даже htmllib.

Кроме того, <a> может содержать javascript: href s, а также есть различные атрибуты on*, которые являются javascript. Вы, вероятно, хотите убрать все это. В общем случае лучше всего использовать белый список: сохраняйте только те атрибуты (и значения атрибутов), которые, как вы знаете, безопасны.

1 голос
/ 11 ноября 2011

Хотя я согласен с Лоуренсом, бывают случаи, когда быстрый и грязный 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)
0 голосов
/ 12 декабря 2010

Замените элементы, которые вы хотите сохранить, значением заполнителя, затем повторно выведите все оставшиеся <. *> И, наконец, замените заполнители соответствующими элементами HTML.

...