¿Cómo uso BeautifulSoup4 para obtener TODO el texto antes de la etiqueta ?

Estoy tratando de raspar algunos datos para mi aplicación. Mi pregunta es que necesito algo. Aquí está el código HTML:

  This is a first sentence. 
This is a second sentence.
This is a third sentence.

Quiero que la salida se vea como

Esta es una primera oración.
Esta es una segunda oración.
Esta es una tercera oración.

¿Es posible hacer eso?

Prueba esto. Debería darte la salida deseada. Simplemente considere que la variable de content utilizada en el siguiente script es el titular de los html elements pegados anteriormente.

 from bs4 import BeautifulSoup soup = BeautifulSoup(content,"lxml") items = ','.join([''.join([item.previous_sibling,item.text,item.next_sibling]) for item in soup.select(".tip.info")]) data = ' '.join(items.split()).replace(",","\n") print(data) 

Salida:

 This is a first sentence. This is a second sentence. This is a third sentence. 

Ciertamente es posible. Responderé con un poco más de generalidad porque dudo que solo desees procesar esa porción de HTML.

En primer lugar, obtener un puntero al elemento td ,

 td = soup.find('td') 

Ahora, note que puede obtener una lista de los hijos de este elemento,

 >>> td_kids = list(td.children) >>> td_kids ['\n This\n ', is a first, '\n sentence.\n ', 
, '\n This\n ', is a second, '\n sentence.\n ',
, 'This\n ', is a third, '\n sentence.\n ',
, '\n']

Algunos de los elementos en esta lista son cadenas, algunos son elementos HTML. Crucialmente, algunos son elementos br .

Puede dividir la lista en primer lugar en una o más listas buscando,

 isinstance(td_kid[], bs4.element.Tag) 

para cada elemento de la lista.

Luego, puedes revisar cada una de las listas secundarias, reemplazando repetidamente las tags convirtiéndolas en sopa y luego obteniendo las listas de niños para estas. Eventualmente, tendrá varias listas secundarias que contienen solo lo que BeautifulSoup llama “cadenas navegables” que puede manipular como de costumbre.

Unir los elementos, entonces sugeriría que elimine los espacios en blanco utilizando un subexamen de expresiones regulares como este:

 result = re.sub(r'\s{2,}', '', ) 

Puede hacer esto fácilmente utilizando bs4 y la manipulación básica de cadenas de esta manera:

 from bs4 import BeautifulSoup data = '''   This is a first sentence. 
This is a second sentence.
This is a third sentence.
''' soup = BeautifulSoup(data, 'html.parser') for i in soup.find_all('td'): print ' '.join(i.text.split()).replace('. ', '.\n')

Esto dará como salida:

 This is a first sentence. This is a second sentence. This is a third sentence. 
 htmlText = """  This is a first sentence. 
This is a second sentence.
This is a third sentence.
""" from bs4 import BeautifulSoup # these two steps are to put everything into one line. may not be necessary for you htmlText = htmlText.replace("\n", " ") while " " in htmlText: htmlText = htmlText.replace(" ", " ") # import into bs4 soup = BeautifulSoup(htmlText, "lxml") # using https://stackoverflow.com/a/34640357/5702157 for br in soup.find_all("br"): br.replace_with("\n") parsedText = soup.get_text() while "\n " in parsedText: parsedText = parsedText.replace("\n ", "\n") # remove spaces at the start of new lines print(parsedText.strip())