Peut-être que vous pouvez utiliser cette fonction:
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
Ajouter quelque chose à vérifier pour être une balise <br />
ou saut de ligne:
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
(ou tout autre chose est plus approprié ... Je suis pas bien avec BeautifulSoup.)
utilisez ensuite partition_by(is_br_or_nl, cs)
pour obtenir (pour cs
ensemble à 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 />]]
Cela devrait être assez facile à traiter. Pour généraliser cela, vous devrez probablement écrire un prédicat pour vérifier si son argument est quelque chose qui vous intéresse ... Ensuite, vous pouvez l'utiliser avec partition_by
pour que tout le reste soit regroupé. Notez que les choses qui vous intéressent sont regroupées aussi - vous devez en principe traiter chaque élément de chaque seconde liste produite par le générateur résultant, en commençant par le premier qui inclut les choses qui vous intéressent.
Merci pour la réponse, mais malheureusement il est pas aussi simple que d'utiliser une expression régulière. J'ai simplifié le document ci-dessus pour mieux illustrer ma question. Le document réel a un fouillis de balises de formatage HTML et similaires. – jamieb
Mais vous ne vous souciez pas du document, juste de la partie séparée par les balises '
'. Utilisez BeatifulSoup pour extraire cette partie en premier. –
Je ne sais pas pourquoi quelqu'un a rejeté votre réponse; J'apprécie l'aide. Je vais essayer quelques idées en fonction de votre suggestion. J'espérais juste que BeautifulSoup aurait éliminé le besoin d'analyse manuelle. Je vous remercie. – jamieb