也许你可以使用这个功能:
def partition_by(pred, iterable):
current = None
current_flag = None
chunk = []
for item in iterable:
if current is None:
current = item
current_flag = pred(current)
chunk = [current]
elif pred(item) == current_flag:
chunk.append(item)
else:
yield chunk
current = item
current_flag = not current_flag
chunk = [current]
if len(chunk) > 0:
yield chunk
添加一些内容以检查是否是 <br /> 标记或换行符:
def is_br(bs):
try:
return bs.name == u'br'
except AttributeError:
return False
def is_br_or_nl(bs):
return is_br(bs) or u'\n' == bs
(或者其他更合适的...我不太喜欢 BeautifulSoup。)
然后使用partition_by(is_br_or_nl, cs) 产生(对于cs 设置为BeautifulSoup.BeautifulSoup(your_example_html).childGenerator())
[[u'Company A'],
[<br />],
[u'\n123 Main St.'],
[<br />],
[u'\nSuite 101'],
[<br />],
[u'\nSomeplace, NY 1234'],
[<br />, u'\n', <br />, u'\n', <br />, u'\n', <br />],
[u'\nCompany B'],
[<br />],
[u'\n456 Main St.'],
[<br />],
[u'\nSomeplace, NY 1234'],
[<br />, u'\n', <br />, u'\n', <br />, u'\n', <br />]]
这应该很容易处理。
为了概括这一点,您可能必须编写一个谓词来检查它的参数是否是您关心的东西......然后您可以将它与partition_by 一起使用,以将其他所有内容集中在一起。请注意,您关心的事情也被归为一类——基本上,您必须处理生成的生成器生成的第二个列表中的每一项,从包含您关心的事情的第一个列表开始。