воскресенье, 11 апреля 2010 г.

Удаление содержимого html по маркеру в тегах на языке python

Задача
Оставить в строке, содержащей 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
Ссылки
  • Часть функционала была взята здесь.

Комментариев нет:

Отправить комментарий