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 contenido HTML entre dos elementos (Python, BeautifulSoup)?

He almacenado un texto en formato html raspando un sitio web, por lo que solo contiene encabezados y párrafos.

A partir de mi estructura HTML que se ve así:

<h2> título uno </h2>
<p> algún texto </p>
<p> algún texto más </p>
<h2> título dos </h2>
.
.
<h2> título tres </h2>

Necesito obtener conjuntos de datos separados que se vean así:

conjunto de datos1:
<h2> título uno </h2>
<p> algún texto </p>
<p> algún texto más </p>

conjunto de datos2:
<h2> título dos </h2>
<p> algún texto </p>
<p> algún texto más </p>

Pensé en analizar el contenido en texto y separarlo utilizando un separador regex, pero no puedo estar seguro de que el texto dentro de las etiquetas de encabezado no esté también dentro de las etiquetas de párrafo.

¿Hay alguna forma de almacenar los datos subsiguientes desde una etiqueta determinada hasta la próxima etiqueta del mismo tipo como se muestra arriba?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, se puede utilizar Beautiful Soup, una biblioteca de Python para web scraping, para analizar el contenido html y extraer los conjuntos de datos deseados. Aquí les mostramos un código de ejemplo:

    from bs4 import BeautifulSoup
    
    # asumiendo que el contenido html se almacena en una variable llamada "html"
    soup = BeautifulSoup(html, 'html.parser')
    
    # encuentra todos los tags h2
    h2_tags = soup.find_all('h2')
    
    # itera a través de los tags h2 y obtiene los párrafos correspondientes
    for i, h2_tag in enumerate(h2_tags):
        # encuentra el siguiente tag h2
        next_h2_tag = h2_tags[i+1] if i < len(h2_tags)-1 else None
    
        # obtiene todos los párrafos entre el tag h2 actual y el siguiente tag h2
        paragraphs = []
        current_tag = h2_tag.find_next_sibling()
        while current_tag != next_h2_tag and current_tag is not None:
            if current_tag.name == 'p':
                paragraphs.append(str(current_tag))
            current_tag = current_tag.find_next_sibling()
    
        # imprime el conjunto de datos
        print(f"conjunto de datos{i+1}: {str(h2_tag)} {' '.join(paragraphs)}")
    

    Este código encuentra todos los tags h2 en el contenido html, y los itera para extraer los párrafos correspondientes. Utiliza el método find_next_sibling() para encontrar el siguiente tag del mismo tipo (ya sea h2 op) y se detiene cuando llega al siguiente tag h2 o al final del contenido html. Luego imprime los conjuntos de datos en el formato deseado.

    Tenga en cuenta que este código asume que los tags h2 y p son siblings y aparecen en el orden h2,p,p, … dentro de cada conjunto de datos. Si hay otros tags en el medio o el orden es diferente, el código puede necesitar ser modificado en consecuencia.

Comments are closed.