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