Возможно, вы могли бы использовать эту функцию:
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
, чтобы все остальное смешалось. Обратите внимание, что вещи, которые вас интересуют, также объединены - вам нужно обрабатывать каждый элемент каждого второго списка, созданного результирующим генератором, начиная с первого, который включает в себя вещи, которые вас волнуют.