В тех случаях, когда мне нужно сохранить состояние, я прибегаю к XML-анализатору в стиле SAX, вот пример сценария, который просто перетягивает строки между вашими МЕХАНИЧЕСКИМИ и ЗАВЕРШЕННЫМИ фигурами.
#!python
import xml.sax
import xml.sax.handler
class Handler(xml.sax.handler.ContentHandler):
def __init__(self):
self.l_ch = list()
self.__in_mechanical = False
def startElement(self, name, attrs):
if name == 'TR':
self.l_rows = list()
def characters (self, ch):
self.l_ch += ch
def endElement(self, name):
if self.l_ch:
ch = ''.join(self.l_ch).strip()
if name == 'Figure':
if ch.find('MECHANICAL') >= 0:
self.__in_mechanical = True
elif ch.find('COMPLETED') >= 0:
self.__in_mechanical = False
elif name == 'TD' and self.__in_mechanical:
self.l_rows.append(ch)
elif name == 'TR' and self.__in_mechanical:
print 'Row:', self.l_rows
self.l_rows = list()
self.l_ch = list()
parser = xml.sax.make_parser()
parser.setContentHandler(Handler())
parser.parse(open('sample.xml'))
Этодает мне следующие результаты и должен заставить вас идти на более сложную работу.
Row: []
Row: [u'Ref. Code', u'DESCRIPTION', u'Rooster', u'747 Dog', u'888 Rabbit']
Row: [u'xxx GOgo xxB', u'Beany xxx', u'nothing here xxx', u'xxx B', u'snake ddd', u'Cow fff', u'eee']
Row: [u'', u'Squirrel Protection', u'S', u'S', u'S', u'S', u'S', u'S', u'S']
Row: [u'J77', u'Rocket Launcher', u'S', u'S', u'S', u'S', u'S', u'S', u'S']
Row: [u'', u'Lunch', u'S', u'S', u'S', u'S', u'S', u'S', u'S']
Row: [u'Jss5', u'Now is the time for all good men', u'-', u'A1', u'A1', u'-', u'-', u'-', u'-']
Row: [u'Capacity', u'', u'2/3', u'2/3', u'2/3']