Удаление содержимого html по маркеру в тегах на языке python (original) (raw)
Задача
Оставить в строке, содержащей html код, всё кроме содержимого тегов (и самих тегов) помеченных определенным маркером ("ignoremarker").
Решение
Воспользуемся функционалом python класса HTMLParser и реализуем функцию, принимающую на вход строку с html кодом и маркер, а на выходе формирующую требуемый html код. Работаем в предположении, что html код на входе - валидный html.
from HTMLParser import HTMLParser
def strip(str, ignoremarker): class StrippingParser(HTMLParser): def init(self, ignoremarker): HTMLParser.init(self) self.stack = [] self.openignores = [] self.ignoremarker = ignoremarker
def handle_data(self, data):
if not len(self.openignores):
self.stack.append(data)
def handle_starttag(self, tag, attrs):
if len(self.openignores):
if self.ignoremarker in dict(attrs):
self.openignores.append(tag)
elif not (self.ignoremarker in dict(attrs)):
self.stack.append('<%s%s>' % (tag, self.__html_attrs(attrs)))
else:
self.openignores.append(tag)
def handle_startend_tag(self, tag, attrs):
if not len(self.openignores) and \
not (self.ignoremarker in dict(attrs)):
self.stack.append('<%s%s/>' % (tag, self.__html_attrs(attrs)))
def handle_endtag(self, tag):
if not len(self.openignores):
self.stack.append('' % (tag))
elif tag in self.openignores:
self.openignores.pop()
def __html_attrs(self, attrs):
_attrs = ''
if attrs:
_attrs = ' %s' % (' '.join([('%s="%s"' % (k,v)) for k,v in attrs.iteritems()]))
return _attrs
stripparser = StrippingParser(ignoremarker)
stripparser.feed(str)
stripparser.close()
return ''.join(stripparser.stack)
Пример использования
teststr = """
Hello
,burn in hell
and be happy!
"""
print strip(teststr, "ignoremarker")
Hello and be happy
Ссылки
- Часть функционала была взята здесь.