Loading [MathJax]/extensions/TeX/AMSsymbols.js

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

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

Задача
Оставить в строке, содержащей html код, всё кроме содержимого тегов (и самих тегов) помеченных определенным маркером ("ignoremarker").

Решение
Воспользуемся функционалом python класса HTMLParser и реализуем функцию, принимающую на вход строку с html кодом и маркер, а на выходе формирующую требуемый html код. Работаем в предположении, что html код на входе - валидный html.
  1. from HTMLParser import HTMLParser  
  2.   
  3. def strip(str, ignoremarker):  
  4.     class StrippingParser(HTMLParser):  
  5.         def __init__(self, ignoremarker):  
  6.             HTMLParser.__init__(self)  
  7.             self.stack = []  
  8.             self.openignores = []  
  9.             self.ignoremarker = ignoremarker  
  10.           
  11.         def handle_data(self, data):  
  12.             if not len(self.openignores):  
  13.                 self.stack.append(data)  
  14.       
  15.         def handle_starttag(self, tag, attrs):  
  16.             if len(self.openignores):  
  17.                 if self.ignoremarker in dict(attrs):  
  18.                     self.openignores.append(tag)  
  19.             elif not (self.ignoremarker in dict(attrs)):  
  20.                 self.stack.append('<%s%s>' % (tag, self.__html_attrs(attrs)))  
  21.             else:  
  22.                 self.openignores.append(tag)  
  23.   
  24.         def handle_startend_tag(self, tag, attrs):  
  25.             if not len(self.openignores) and \  
  26.                not (self.ignoremarker in dict(attrs)):  
  27.                 self.stack.append('<%s%s/>' % (tag, self.__html_attrs(attrs)))  
  28.           
  29.         def handle_endtag(self, tag):  
  30.             if not len(self.openignores):  
  31.                 self.stack.append('' % (tag))  
  32.             elif tag in self.openignores:  
  33.                 self.openignores.pop()  
  34.       
  35.         def __html_attrs(self, attrs):  
  36.             _attrs = ''  
  37.             if attrs:  
  38.                 _attrs = ' %s' % (' '.join([('%s="%s"' % (k,v)) for k,v in attrs.iteritems()]))  
  39.             return _attrs  
  40.       
  41.     stripparser = StrippingParser(ignoremarker)  
  42.     stripparser.feed(str)  
  43.     stripparser.close()  
  44.     return ''.join(stripparser.stack)  
Пример использования
  1. teststr = """ 
  2.  
  3. Hello  
  4.  
  5. <div ignoremarker="">,<span ignoremarker="">burn in hell</span> </div>and be happy! 
  6.  
  7. """  
  8.   
  9. print strip(teststr, "ignoremarker")  
Hello and be happy
Ссылки
  • Часть функционала была взята здесь.

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

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