4
votes

Extraire des données textuelles d'une balise Div mais pas d'une balise H3 enfant

J'ai un extrait de code HTML dont j'ai besoin pour obtenir des données à l'aide de BeautifuSoup:

Teacher
                        John Doe

J'ai besoin d'obtenir la valeur .text du deuxième div du haut "John Doe", mais pas la valeur .text à l'intérieur de la balise h3 dans cette div . Mon défi est qu'actuellement j'obtiens les deux valeurs textuelles comme dans cet extrait de code:

# Python 3.7, BeautifulSoup 4.7
# html variable is equal to the above HTML snippet
from bs4 import BeautifulSoup
soup4 = BeautifulSoup(html, "html.parser")
# Get School Head Teacher
school_head_teacher = soup4.find_all('div', {'class':'sidebar-box'})
school_head_teacher = school_head_teacher[1].text.strip()
print(school_head_teacher)

Ceci génère:

<!doctype html>
<html lang="en">
    <body>
        <div class="sidebar-box">
            <h3><i class="fa fa-users"></i> Management Team</h3>
                        Chairman, Director
        </div>
        <div class="sidebar-box">
            <h3><i class="fa fa-male"></i> Teacher</h3>
                        John Doe
        </div>
        <div class="sidebar-box">
            <h3><i class="fa fa-mortar-board"></i> Awards </h3>
                        National Top Quality Educational Development
        </div>
        <div class="sidebar-box">
            <h3><i class="fa fa-building"></i> School Type</h3>
                        Secondary
        </div>
    </body>
</html>

Cependant , Je n'ai besoin que de la valeur John Doe.


0 commentaires

3 Réponses :


4
votes

J'ai proposé 2 solutions. La première solution pas la plus élégante. Mais juste du haut de ma tête rapidement, vous pouvez diviser cela à nouveau et tout rassembler après "Enseignant"

Option 1:

from bs4 import BeautifulSoup
import re

soup4 = BeautifulSoup(html, "html.parser")
# Get School Head Teacher
for elem in soup4(text=re.compile('Teacher')):
    print (elem.parent.next_sibling.strip())

Sortie:

soup4(text=re.compile('Teacher'))[0].parent.next_sibling.strip()

Option 2:

Celle-ci, je pense, est un peu meilleure . Vous trouvez la balise contenant Enseignant . Ensuite, vous obtenez la balise parent. Ensuite, puisque vous voulez la deuxième partie, vous utilisez .next_sibling et la dépouillez.

print(school_head_teacher)
John Doe

Je l'ai eu dans une boucle for au cas où il y aurait plusieurs professeurs . Mais vous pouvez remplacer le code supérieur au lieu de la boucle for

html = '''
!doctype html>
<html lang="en">
    <body>
        <div class="sidebar-box">
            <h3><i class="fa fa-users"></i> Management Team</h3>
                        Chairman, Director
        </div>
        <div class="sidebar-box">
            <h3><i class="fa fa-male"></i> Teacher</h3>
                        John Doe
        </div>
        <div class="sidebar-box">
            <h3><i class="fa fa-mortar-board"></i> Awards </h3>
                        National Top Quality Educational Development
        </div>
        <div class="sidebar-box">
            <h3><i class="fa fa-building"></i> School Type</h3>
                        Secondary
        </div>
    </body>
</html>'''



from bs4 import BeautifulSoup
soup4 = BeautifulSoup(html, "html.parser")
# Get School Head Teacher
school_head_teacher = soup4.find_all('div', {'class':'sidebar-box'})
school_head_teacher = school_head_teacher[1].text.strip()

school_head_teacher = school_head_teacher.split()[1:]
school_head_teacher = ' '.join(school_head_teacher)

print(school_head_teacher)


1 commentaires

J'accepte votre solution, l '«option 2» vraiment. Il répond parfaitement à mes besoins, beaucoup pythoniques et répond même à certains cas d'utilisation que je n'ai pas inclus dans la question.



1
votes

Autre option:

John Doe

Résultat:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")

teacher_name = soup.find_all('div', class_='sidebar-box')
print(teacher_name[1].contents[2].strip())


0 commentaires

1
votes

Depuis

Puisque John Doe est le prochain frère de

Enseignant

Nous pouvons utiliser une combinaison de find_next () et next_sibling sur


0 commentaires