С помощью регулярного выражения это быстро, и полное извлечение возможно с легкостью:
import re
ss = '''a line
another line
<address>
Some street address<br />City, State and ZIP<br />
<div class="phone">
(123) 456-7890
</div>
<glomo>
Hello glomo
</glomo>
</address>
end of text'''
def analyze(ss,tag,regx = re.compile('<([^ ]+)([^>]*)>(.*?)</\\1>',re.DOTALL)):
extract = re.search('<(%s)[^>]*>(.*?)</\\1>' % tag,ss,re.DOTALL).group(2)
li = []
def trt(m):
li.append((m.group(1),m.group(2),m.group(3).strip(' \t\r\n')))
li.append(('','',regx.sub(trt,extract).strip('\r\n\t ')))
return li
resu = analyze(ss,'address')
for el in resu:
print el
print
print resu[-1][2]
результат
('div', ' class="phone"', '(123) 456-7890')
('glomo', '', 'Hello glomo')
('', '', 'Some street address<br />City, State and ZIP<br />')
Some street address<br />City, State and ZIP<br />
Или помещение результатов в словарь:
def analyze(ss,tag,regx = re.compile('<([^ ]+)([^>]*)>(.*?)</\\1>',re.DOTALL)):
extract = re.search('<(%s)[^>]*>(.*?)</\\1>' % tag,ss,re.DOTALL).group(2)
di = {}
def trt(m):
di[m.group(1)] = (m.group(2),m.group(3).strip(' \t\r\n'))
di[''] = ('',regx.sub(trt,extract).strip('\r\n\t '))
return di
disu = analyze(ss,'address')
print "disu[''] ==",disu['']
print "disu['div'] ==",disu['div']
print (disu[x][1] for x in disu if 'phone' in disu[x][0]).next()
result
disu[''] == ('', 'Some street address<br />City, State and ZIP<br />')
disu['div'] == (' class="phone"', '(123) 456-7890')
(123) 456-7890
Функции ничего не возвращают (или, скорее, он возвращает None), тогда regx.sub(trt,extract)
заменяет основатели тегов в extract на ""
, остается только текст в проверенном теге.