es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo extraer texto y eliminar etiquetas HTML en otra columna

Tengo una columna de texto libre en un dataframe de Python con etiquetas HTML.

ID  Campo de texto libre
1   <p><span style="background-color: rgb(255, 255, 255); color: rgb(37, 36, 35); font-family: 
    Arial; font-size: 10.5pt;">Texto1:</span></p><p><span style="background-color: rgb(255, 255, 
    255); color: rgb(37, 36, 35); font-family: Arial; font-size: 10.5pt;">Puntuación: 5</span></p><p> 
    <span style="background-color: rgb(255, 255, 255); color: rgb(37, 36, 35); font-family: Arial; 
    font-size: 10.5pt;">B - </span><span style="background-color: rgb(255, 255, 255); color: 
    rgb(36, 36, 36); font-family: Arial; font-size: 10.5pt;">Texto2</span></p><p><span 
    style="background-color: rgb(255, 255, 255); color: rgb(37, 36, 35); font-family: Arial; 
    font-size: 10.5pt;">Texto6</span></p><p><span style="background-color: rgb(255, 255, 255); 
    color: rgb(37, 36, 35); font-family: Arial; font-size: 10.5pt;">Texto3</span></p><p><span 
    style="background-color: rgb(255, 255, 255); color: rgb(37, 36, 35); font-family: Arial; 
    font-size: 10.5pt;">Texto4</span></p>
2   <p>Texto10</p>
3   <p>El cielo es azul</p>
4   <p>Texto3</p><p><br></p><p>Texto19</p>
5   <p>Queja1</p><p><br></p><p>Texto1</p><p>hospo 2</p><p>Tes45</p><p><br></p><p>test</p>
6   <p>Test44</p>
7   <p>Test54</p>

He intentado utilizar esto:

from bs4 import BeautifulSoup

df['free text'].apply(
    lambda x: list(BeautifulSoup(x, "html.parser").stripped_strings)
)

Pero obtengo este error:

TypeError: object of type 'NoneType' has no len()

¿Qué estoy haciendo incorrectamente?

Agradezco cualquier tipo de ayuda.

Gracias

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la función BeautifulSoup está devolviendo None en lugar de la salida esperada. Esto podría deberse a una entrada inválida o a un problema con el analizador utilizado.

    Una posible causa del error es que la columna “free text” contiene valores nulos que no son manejados correctamente por la función lambda utilizada en el método apply. Para solucionar esto, podrías modificar la función lambda para comprobar si x no es nulo antes de llamar a BeautifulSoup. Por ejemplo:

    lambda x: list(BeautifulSoup(x, "html.parser").stripped_strings) if x is not None else []
    

    Esto devolverá una lista vacía para cualquier valor nulo en la columna “free text”, evitando el TypeError.

    Alternativamente, también podrías comprobar que la entrada x es una cadena antes de pasarla a BeautifulSoup, de la siguiente manera:

    lambda x: (list(BeautifulSoup(x, "html.parser").stripped_strings) if isinstance(x, str) else [])
    

    Esto solo aplicará BeautifulSoup a entradas de cadena válidas y devolverá una lista vacía para cualquier otra cosa.

Comments are closed.