Excluir etiqueta no deseada en Beautifulsoup Python

 I Like  to punch  your face  

Cómo imprimir “Me gusta tu cara” en lugar de “Me gusta golpear tu cara”

Intenté esto

 lala = soup.find_all('span') for p in lala: if not p.find(class_='unwanted'): print p.text 

pero da “TypeError: find () no toma argumentos de palabra clave”

Puede usar extract() para eliminar la etiqueta no deseada antes de recibir el texto.

Pero mantiene todos '\n' y spaces por lo que necesitarás algo de trabajo para eliminarlos.

 data = ''' I Like  to punch  your face ''' from bs4 import BeautifulSoup as BS soup = BS(data, 'html.parser') external_span = soup.find('span') print("1 HTML:", external_span) print("1 TEXT:", external_span.text.strip()) unwanted = external_span.find('span') unwanted.extract() print("2 HTML:", external_span) print("2 TEXT:", external_span.text.strip()) 

Resultado

 1 HTML:  I Like  to punch  your face  1 TEXT: I Like to punch your face 2 HTML:  I Like your face  2 TEXT: I Like your face 

Puede omitir todos los objetos de Tag dentro del tramo externo y mantener solo los objetos de NavigableString (es texto plano en HTML).

 data = ''' I Like  to punch  your face ''' from bs4 import BeautifulSoup as BS import bs4 soup = BS(data, 'html.parser') external_span = soup.find('span') text = [] for x in external_span: if isinstance(x, bs4.element.NavigableString): text.append(x.strip()) print(" ".join(text)) 

Resultado

 I Like your face 

Puede encontrar fácilmente el texto (no) deseado así:

 from bs4 import BeautifulSoup text = """ I Like  to punch  your face """ soup = BeautifulSoup(text, "lxml") for i in soup.find_all("span"): if 'class' in i.attrs: if "unwanted" in i.attrs['class']: print(i.text) 

A partir de aquí, se puede hacer fácilmente todo lo demás