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.
3 Réponses :
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)
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.
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())
Depuis
Puisque John Doe est le prochain frère de Enseignant
Nous pouvons utiliser une combinaison de find_next () et next_sibling sur