2017-10-18 1 views
0

Ich habe ein BS4-Objekt und wählen Sie einen Teil davon mit findAll und find_next_sibling. Von diesem Teil, das ich „Geschwister“ ich auf jede einzelne Zeile mit einer for-Schleife wie folgt aufrufen:Python3 Zugriff bs4 Element Linien mit 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 

Weiß jemand, was ich hier fehlt?

Antwort

0

Unter der Annahme, dass ich Ihre Situation zu verstehen, kann ich einen einfacheren Weg zu gehen darüber vor.

Angenommen, Sie haben HTML so.

<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> 

Dann können Sie das erste span Element finden und dann alle seine Geschwister wie dies unter Verwendung von Code identifizieren.

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

Diese Linie soll lediglich angezeigt werden, was die findNextSiblings Methode gibt Ihnen.

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

Das bedeutet, dass, wenn Sie einen Zeiger auf das erste Geschwister haben Sie alle anderen mit einem einzigen for Aussage zu bekommen.

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

Eine weitere Methode stellt fetchNextSiblings die gleichen Ergebnisse wie die oben verwendeten.

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

Vielen Dank für Ihren Vorschlag. Ich könnte mein Problem lösen, indem ich auf Geschwister [Index + 2] anstelle von Index + 1 zugreife. Der Inhalt wurde in
Klammern verschachtelt, und ich habe auf diese Klammern zugegriffen, wenn ich index + 1 verwendet habe. – Ollie

+0

Gern geschehen. Ich habe auf diese Weise geantwortet, weil ich dachte, Sie könnten es nützlich finden, und ich konnte nicht genau sagen, welches Problem Sie bekämpft haben. –

+0

Eigentlich habe ich nicht realisiert, dass diese
Klammern eine eigene Linie bilden. Ich dachte, sie gehören zu den Linien, die ich betrachtete. – Ollie

0

Die Geschwister, die Sie mit BeautifulSoup erstellt haben, können Zeile für Zeile nicht gelesen werden.

Das Geschwister ist vom Typ bs4.element.Tag. Wenn Sie es Zeile für Zeile lesen möchten, müssen Sie es in eine Zeichenfolge konvertieren und dann .splitlines() darauf aufrufen.

So:

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

Vielen Dank für Ihren Kommentar. Die Aufteilung von Zeilen ist nicht erforderlich, da die for-Schleife zeilenweise auf den Inhalt zugreift. – Ollie