Задача
Оставить в строке, содержащей 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 helland be happy! """ print strip(teststr, "ignoremarker")
Hello and be happy
Ссылки
- Часть функционала была взята здесь.
Комментариев нет:
Отправить комментарий