2017-08-15 1 views
0

je faisais quelque chose comme ceci en utilisant BeautifulSoup:Filtrage en classe spécifique dans BeautifulSoup

for name in soup.find_all('div','name'): 

Quand je suis en utilisant ce filtre, je crois comprendre que je vais obtenir toutes les div étiquettes avec le nom d'attribut ou classe name .

Cependant, je ne veux pas toutes les instances de la balise div avec l'attribut name. Je veux certaines instances dans lesquelles ils se situent dans un certain sous-arbre du fichier HTML. Plus précisément, les instances dans l'étiquette <u1 class="list-box mb-3 spacer">...<u1\>, qui est deux niveaux au-dessus des étiquettes que je cherche. Donc ma question est, comment pourrais-je écrire le filtre dans soup.find_all() pour zoomer dans une classe? Je m'excuse d'avance si j'avais mélangé toute terminologie. C'est la première fois que je tente de gratter sur le Web. Je ne savais pas quoi regarder dans la documentation.

Pour référence, c'est le site que je tente de faire gratter web sur: http://pd.appbank.net/ml39

Répondre

0

Vous ne pouvez pas spécifier une recherche de balises dans un certain parent directement, mais vous pouvez utiliser une boucle imbriquée pour obtenir c'est fait. Tout d'abord, obtenez tous les tags ul avec la classe list-box mb-3 spacer, puis obtenez tous les div sous chacun d'eux.

div_list = [] 

for ul in soup.find_all('ul', {'class' : 'list-box mb-3 spacer'}): 
    div_list.extend(ul.find_all('div', {'class' : 'name'})) 

print(div_list) 
+0

Serais-je capable de faire quelque chose de similaire si je voulais filtrer les parents qui ont des enfants avec certaines chaînes de correspondance? En ce moment, je regarde une page avec plusieurs parents "spacer mb-5", et tous ont un enfant "title-border mb-3", mais je veux seulement extraire des informations d'un parent qui correspond à un certain chaîne. SoupStrainer aiderait-il ici? –

+0

@Psignarok Possiblement. Vous auriez à faire un 'if tag.find (...):' (quelque chose dans ce sens). –

0

Depuis le page n'a qu'une seule <ul> étiquette avec la classe 'mb-3 zone de liste entretoise. Vous pouvez d'abord trouver la balise <ul class="list-box mb-3 spacer"> puis trouver la <div class="name"> respective dans le <ul class="list-box mb-3 spacer"> comme:

ulTag = soup.find("ul", attrs={"class": "list-box mb-3 spacer"}) divTags = ulTag.find_all("div", {"class": "name"}) print(divTags)