2009-10-15 8 views
2

Je suis en train de lire sur BeautifulSoup pour graver des pages html assez lourdes. En parcourant la documentation de BeautifulSoup, je n'arrive pas à trouver un moyen facile de sélectionner des éléments enfants.Sélectionnez des éléments enfants spécifiques avec BeautifulSoup

avec le code HTML:

<div id="top"> 
    <div>Content</div> 
    <div> 
    <div>Content I Want</div> 
    </div> 
</div> 

Je veux un moyen facile de d'obtenir le "contenu I Want" J'ai donné le haut de l'objet. En venant à BeautifulSoup je pensais que ce serait facile, et quelque chose comme topobj.nodes [1] .nodes [0] .string. Au lieu de cela, je ne vois que des variables et des fonctions qui renvoient également les éléments avec des nœuds de texte, des commentaires, etc.

Ai-je raté quelque chose? Ou ai-je vraiment besoin de recourir à une forme longue en utilisant .find() ou pire encore en utilisant des comphrensions de liste sur la variable .contents.

La raison en est que je ne crois pas que les espaces de la page Web soient identiques, donc je veux l'ignorer et ne passer que sur les éléments.

Répondre

2

Vous êtes plus flexible avec find, et pour obtenir ce que vous voulez, vous avez juste besoin de courir:

node = p.find('div', text="Content I Want") 

Mais comme il pourrait ne pas être comment vous voulez y arriver, les options suivantes pourraient vous convenir mieux:

xml = """<div id="top"><div>Content</div><div><div>Content I Want</div></div></div>""" 
from BeautifulSoup import BeautifulSoup 
p = BeautifulSoup(xml) 

# returns a list of texts 
print p.div.div.findNextSibling().div.contents 
# returns a list of texts 
print p.div.div.findNextSibling().div(text=True) 
# join (and strip) the values 
print ''.join(s.strip() for s in p.div.div.findNextSibling().div(text=True)) 
Questions connexes