How can I make a data frame from scrapped page with beautiful soup: <h4> and their corresponding <p>

Viewed 24

This is a sample of a page I want to web scrape

<div class="docente_datos">
          <h4>Eliseo Mendoza Ortiz</h4>
          <p><b>Cargo:</b> Director Estatal de Preparatorias          </p><p><b>Grado Académico:</b> Maestría en Tecnología de Redes e Informática</p>          <p><b>Áreas de interés:</b><br>-Física</p>          <p><b>eliseo.mendoza@cetys.mx</b></p>
          <p>52 (664) 903-1800 Ext. 253</p>
        </div>
<h4>Eliseo Mendoza Ortiz</h4>
<p><b>Cargo:</b> Director Estatal de Preparatorias          </p>
<b>Cargo:</b>
 Director Estatal de Preparatorias          
<p><b>Cargo:</b> Director Estatal de Preparatorias          </p>
<p><b>Grado Académico:</b> Maestría en Tecnología de Redes e Informática</p>
<b>Grado Académico:</b>
 Maestría en Tecnología de Redes e Informática
<p><b>Grado Académico:</b> Maestría en Tecnología de Redes e Informática</p>
<p><b>Áreas de interés:</b><br>-Física</p>
<b>Áreas de interés:</b>
<br>
-Física
<p><b>Áreas de interés:</b><br>-Física</p>
<p><b>eliseo.mendoza@cetys.mx</b></p>
<b>eliseo.mendoza@cetys.mx</b>
<p><b>eliseo.mendoza@cetys.mx</b></p>
<p>52 (664) 903-1800 Ext. 253</p>
<div class="docente_datos">
          <h4>Eliseo Mendoza Ortiz</h4>
          <p><b>Cargo:</b> Director Estatal de Preparatorias          </p><p><b>Grado Académico:</b> Maestría en Tecnología de Redes e Informática</p>          <p><b>Áreas de interés:</b><br>-Física</p>          <p><b>eliseo.mendoza@cetys.mx</b></p>
          <p>52 (664) 903-1800 Ext. 253</p>
        </div>
<div class="docente_cont">
        <div class="docente_foto"><img class="lazy loaded" width="128" height="128" src="https://www.cetys.mx/wp-content/uploads/2020/01/eliseo-mendoza.jpg" data-src="https://www.cetys.mx/wp-content/uploads/2020/01/eliseo-mendoza.jpg" data-was-processed="true"></div>
        <div class="docente_datos">
          <h4>Eliseo Mendoza Ortiz</h4>
          <p><b>Cargo:</b> Director Estatal de Preparatorias          </p><p><b>Grado Académico:</b> Maestría en Tecnología de Redes e Informática</p>          <p><b>Áreas de interés:</b><br>-Física</p>          <p><b>eliseo.mendoza@cetys.mx</b></p>
          <p>52 (664) 903-1800 Ext. 253</p>
        </div>
              </div>
<div class="docente_cont">
        <div class="docente_foto"><img class="lazy loaded" width="128" height="128" src="https://www.cetys.mx/wp-content/uploads/2020/01/Marisela_Ventura.jpg" data-src="https://www.cetys.mx/wp-content/uploads/2020/01/Marisela_Ventura.jpg" data-was-processed="true"></div>
        <div class="docente_datos">
          <h4>Marisela Ventura Rocha</h4>
          <p><b>Cargo:</b> Director de Preparatoria          </p><p><b>Grado Académico:</b> Maestría en MBA</p>          <p><b>Áreas de interés:</b><br>- Desarrollo emprendedor <br>
- Contabilidad</p>          <p><b>marisela.ventura@cetys.mx</b></p>
          <p>52 (664) 903-1800 Ext. 2640</p>
        </div>
              </div>
<div class="docente_foto"><img class="lazy loaded" width="128" height="128" src="https://www.cetys.mx/wp-content/uploads/2020/01/Marisela_Ventura.jpg" data-src="https://www.cetys.mx/wp-content/uploads/2020/01/Marisela_Ventura.jpg" data-was-processed="true"></div>
<div class="docente_datos">
          <h4>Marisela Ventura Rocha</h4>
          <p><b>Cargo:</b> Director de Preparatoria          </p><p><b>Grado Académico:</b> Maestría en MBA</p>          <p><b>Áreas de interés:</b><br>- Desarrollo emprendedor <br>
- Contabilidad</p>          <p><b>marisela.ventura@cetys.mx</b></p>
          <p>52 (664) 903-1800 Ext. 2640</p>
        </div>
<h4>Marisela Ventura Rocha</h4>
<p><b>Cargo:</b> Director de Preparatoria          </p>
<b>Cargo:</b>
 Director de Preparatoria          
<p><b>Cargo:</b> Director de Preparatoria          </p>
<p><b>Grado Académico:</b> Maestría en MBA</p>
<b>Grado Académico:</b>
 Maestría en MBA
<p><b>Grado Académico:</b> Maestría en MBA</p>
<p><b>Áreas de interés:</b><br>- Desarrollo emprendedor <br>
- Contabilidad</p>
<b>Áreas de interés:</b>
<br>
- Desarrollo emprendedor 
<br>

- Contabilidad
<p><b>Áreas de interés:</b><br>- Desarrollo emprendedor <br>
- Contabilidad</p>
<p><b>marisela.ventura@cetys.mx</b></p>
<b>marisela.ventura@cetys.mx</b>
<p><b>marisela.ventura@cetys.mx</b></p>
<p>52 (664) 903-1800 Ext. 2640</p>
<div class="docente_datos">
          <h4>Marisela Ventura Rocha</h4>
          <p><b>Cargo:</b> Director de Preparatoria          </p><p><b>Grado Académico:</b> Maestría en MBA</p>          <p><b>Áreas de interés:</b><br>- Desarrollo emprendedor <br>
- Contabilidad</p>          <p><b>marisela.ventura@cetys.mx</b></p>
          <p>52 (664) 903-1800 Ext. 2640</p>
        </div>

I did a for loop to extract the info I want:

children = docentes.find_all(['h4','p'])    
for i in children:
    if i.name == 'h4':
        print('\n\n\n'+ i.get_text()+'\n')
    if i.name == 'p':
        print(i.get_text())

and I got this:

Ana Georgina Villalba Cuervo

Cargo: Directora de la Escuela de Educación Media Superior          
Grado Académico: Maestría en Educación
Áreas de interés:-Administración 
-Emprendedurismo 
-Gestión educativa
georgina.villalba@cetys.mx
52 (686) 567-3700  Ext. 1704



Doris Elizabeth Becerra Polío

Cargo: Coordinadora Académica                              
doris.becerra@cetys.mx 
52 (686) 567-3700 Ext. 1704



Alicia Hermosillo Villa

Cargo: Coordinadora del programa del Diploma Bachillerato Internacional          
Grado Académico: Maestría en Administración con concentración en Mercadotecnia
Áreas de interés:-Estructura socioeconómica de México 
-Estructura socioeconómica de Baja California
-Geografía 

alicia.hermosillo@cetys.mx
52 (686) 567-3700 Ext. 1704



Gerardo López Verdugo

Cargo: Coordinador de Idiomas                              
gerardo.lopez@cetys.mx
52 (686) 567-3700 Ext. 1704

My question is, how can I do a data frame that looks like this:

Name Info
Ana Georgina Villalba Cuervo Cargo: Directora de la Escuela de Educación Media Superior
Grado Académico: Maestría en Educación
Áreas de interés:-Administración
Emprendedurismo
Gestión educativa
georgina.villalba@cetys.mx
52 (686) 567-3700 Ext. 1704
Doris Elizabeth Becerra Polío Cargo: Coordinadora Académica
doris.becerra@cetys.mx
52 (686) 567-3700 Ext. 1704

basically a data frame with column= Name and a column = info, to store contacts information.

any ideas how I can accomplish this?

thanks for your help

1 Answers

You can select all <div class="docente_datos"> and get the values from there (in the HTML there are lots of duplicates, so you can use df.drop_duplicates() to filter them).

If html_doc contains the HTML snippet from the question:

import pandas as pd
from bs4 import BeautifulSoup


soup = BeautifulSoup(html_doc, "html.parser")

all_data = []
for datos in soup.select(".docente_datos"):
    name = datos.h4.text
    datos.h4.extract()
    info = datos.get_text(strip=True, separator="\n") # or use separator=" " if you don't want newlines in info
    all_data.append([name, info])

df = pd.DataFrame(all_data, columns=["Name", "Info"]).drop_duplicates("Name")
print(df)

Prints:

                     Name                                                                                                                                                                                         Info
0    Eliseo Mendoza Ortiz  Cargo:\nDirector Estatal de Preparatorias\nGrado Académico:\nMaestría en Tecnología de Redes e Informática\nÁreas de interés:\n-Física\neliseo.mendoza@cetys.mx\n52 (664) 903-1800 Ext. 253
3  Marisela Ventura Rocha     Cargo:\nDirector de Preparatoria\nGrado Académico:\nMaestría en MBA\nÁreas de interés:\n- Desarrollo emprendedor\n- Contabilidad\nmarisela.ventura@cetys.mx\n52 (664) 903-1800 Ext. 2640
Related