Forse si potrebbe utilizzare questa funzione:
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
aggiungere qualcosa per controllare per essere un <br />
tag o di nuova riga:
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
(o qualsiasi altra cosa è più opportuno ... Sono non molto buono con BeautifulSoup.)
Quindi utilizzare partition_by(is_br_or_nl, cs)
per produrre (per cs
set di 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 />]]
Questo dovrebbe essere abbastanza facile da elaborare.
Per generalizzare questo, probabilmente dovresti scrivere un predicato per verificare se il suo argomento è qualcosa che ti interessa ... Quindi potresti usarlo con partition_by
per far raggruppare tutto il resto. Nota che le cose che ti interessano sono raggruppate insieme - in pratica devi elaborare ogni elemento di ogni secondo elenco prodotto dal generatore risultante, iniziando dal primo che include le cose che ti interessano.
Grazie per la risposta, ma purtroppo non è così semplice come solo utilizzando un'espressione regolare. Ho semplificato il documento sopra per illustrare meglio la mia domanda. Il documento vero ha un guazzabuglio di tag di formattazione HTML e simili. – jamieb
Ma non ci si preoccupa * del documento, solo la parte separata dai tag '
'. Usa BeatifulSoup per estrarre prima quella parte. –
Non sono sicuro del motivo per cui qualcuno ha downvoted la tua risposta; Apprezzo l'aiuto. Proverò un paio di idee sulla base del tuo suggerimento. Speravo solo che BeautifulSoup avrebbe eliminato la necessità di un parsing manuale. Grazie. – jamieb