2017-10-18 33 views
0

J'ai un objet bs4 et en sélectionne une partie en utilisant findAll et find_next_sibling. De cette partie que j'appelle « frères et soeurs » J'accès chaque ligne avec une boucle comme ceci:python3 accéder aux lignes de l'élément bs4 avec l'index

for cursor in sibling: 
    index = sibling.index(cursor) 
    print(index)   # works until here 
    next_cursor = sibling[index+1] 
    print(next_cursor) # breaks with KeyError 

Est-ce que quelqu'un sait ce que je suis absent ici?

Répondre

0

En supposant que je comprends votre situation, je peux suggérer une façon d'aller plus facile à ce sujet.

Supposons que vous ayez un code HTML comme celui-ci.

<span id="first">I'm first</span> 
<span>first sibling</span> 
<span>second sibling</span> 
<span>third sibling</span> 
<span>fourth sibling</span> 
<span>fifth sibling</span> 

Ensuite, vous pouvez trouver le premier élément span puis identifier tous ses frères et sœurs en utilisant le code comme celui-ci.

>>> import bs4 
>>> soup = bs4.BeautifulSoup(open('temp.htm').read(), 'lxml') 
>>> first = soup.select('#first') 
>>> first 
[<span id="first">I'm first</span>] 

Cette ligne est destinée simplement à afficher ce que la méthode findNextSiblings vous donne.

>>> first[0].findNextSiblings() 
[<span>first sibling</span>, <span>second sibling</span>, <span>third sibling</span>, <span>fourth sibling</span>, <span>fifth sibling</span>] 

Cela signifie que, une fois que vous avez un pointeur sur le premier frère, vous pouvez obtenir tous les autres avec une seule instruction for.

>>> for sib in first[0].findNextSiblings(): 
...  sib.text 
... 
'first sibling' 
'second sibling' 
'third sibling' 
'fourth sibling' 
'fifth sibling' 

Une autre méthode, fetchNextSiblings fournit les mêmes résultats que celle utilisée ci-dessus.

>>> first[0].fetchNextSiblings() 
[<span>first sibling</span>, <span>second sibling</span>, <span>third sibling</span>, <span>fourth sibling</span>, <span>fifth sibling</span>] 
+0

Nous vous remercions de votre suggestion. Je pourrais résoudre mon problème en accédant à frère [index + 2] au lieu de index + 1. Le contenu était imbriqué dans les parenthèses
et j'ai accédé à ces parenthèses lorsque j'ai utilisé l'index + 1. – Ollie

+0

De rien. J'ai répondu de cette façon parce que je pensais que vous pourriez trouver cela utile et je ne pourrais pas dire quel problème vous étiez en train de combattre. –

+0

En fait, je n'ai pas réalisé que ces supports
constituaient une ligne qui leur était propre. Je pensais qu'ils faisaient partie des lignes que je regardais. – Ollie

0

Le frère que vous avez créé avec BeautifulSoup ne peut pas être lu ligne par ligne comme ceci.

Le frère est du type bs4.element.Tag. Si vous voulez le lire ligne par ligne, vous devez le convertir en chaîne, puis appeler le .splitlines().

Comme ceci:

for line in str(sibling).splitlines(): 
    ... 
+0

Merci pour votre commentaire. La division des lignes n'est pas nécessaire car la boucle for accède au contenu ligne par ligne. – Ollie