BeautifulSoup – combina tags consecutivas

Tengo que trabajar con el HTML más desordenado donde las palabras individuales se dividen en tags separadas, como en el siguiente ejemplo:

INTRODUCTION 

Eso es algo difícil de leer, pero básicamente la palabra “INTRODUCCIÓN” se divide en

 I 

y

 NTRODUCTION 

con las mismas propiedades en línea para ambas tags span y b.

¿Cuál es una buena manera de combinar estos? Me di cuenta de que me gustaría encontrar tags b consecutivas como esta, pero estoy atascado en cómo fusionaría las tags b consecutivas.

 for b in soup.findAll('b'): try: if b.next_sibling.name=='b': ## combine them here?? except: pass 

¿Algunas ideas?

EDITAR: la salida esperada es la siguiente

 INTRODUCTION 

Tal vez podría verificar si b.previousSibling es una etiqueta b , luego agregue el texto interno del nodo actual a eso. Después de hacer esto, debería poder eliminar el nodo actual del árbol con b.decompose .

La siguiente solución combina el texto de todas las tags seleccionadas en una de su elección y descompone las demás.

Si solo desea combinar el texto de tags consecutivas, siga el enfoque de Danny .

Código:

 from bs4 import BeautifulSoup html = ''' 
I NTRODUCTION
''' soup = BeautifulSoup(html, 'lxml') container = soup.select_one('#wrapper') # it contains b tags to combine b_tags = container.find_all('b') # combine all the text from b tags text = ''.join(b.get_text(strip=True) for b in b_tags) # here you choose a tag you want to preserve and update its text b_main = b_tags[0] # you can target it however you want, I just take the first one from the list b_main.span.string = text # replace the text for tag in b_tags: if tag is not b_main: tag.decompose() print(soup)

Cualquier comentario apreciado.