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