Удаление содержимого 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

Ссылки