Search on blog:

Python: Jak w BeautifulSoup znaleść element występujący za (lub przed) innym elementem.

BeautifulSoup ma wiele funkcji do szukania elementów - nie tylko find() i find_all() ale także

Może on też szukać w przeciwnym kierunku używając

Ma także atrybuty (dla pogrania pojedyńczego elementu)

i iteratorory (dla pogrania wielu elementów)

które mogą działać inaczej niż funkcje.

W przykładowym kodzie używam find() aby znaleść div z current a następnie używam find_next() aby znaleść inne elementy za nim występujące. lub find_previous() znaleść inne elementy przed nim występujące.

Używając opcji jak class, id, itd. nie musi dać dokłanie następnego/poprzedniego elementu ale pierwszy element, który pasuje do opcji.

Aby szukać dokładnie następny/poprzedni można użyć True w miejsce tagu find_next(True), find_previous(True), itp. lub nawet bez tagu find_next(), find_previous(), itp.

text = '''
<div class="y">Y</div>
<div class="a">-2</div>
<div class="a">-1</div>
<div class="current">0</div>
<div class="a">1</div>
<div class="a">2</div>
<div class="x">X</div>
'''

from bs4 import BeautifulSoup as BS

soup = BS(text, 'html.parser')

current = soup.find('div', {'class': 'current'})

# --------------------------------------------

print('\n--- next ---\n')

next_a = current.find_next('div')
print('next_a:', next_a.string)

next_a = next_a.find_next('div')
print('next_a:', next_a.string)

next_x = current.find_next('div', {'class', 'x'})
print('next_x:', next_x.string)

all_next_a = current.find_all_next('div', {'class', 'a'})
print('all_next_a:', [x.string for x in all_next_a])

# --------------------------------------------

print('\n--- prev ---\n')

prev_a = current.find_previous('div')
print('prev_a:', prev_a.string)

prev_a = prev_a.find_previous('div')
print('prev_a:', prev_a.string)

prev_y = current.find_previous('div', {'class', 'y'})
print('prev_y:', prev_y.string)

all_prev_a = current.find_all_previous('div', {'class', 'a'})
print('all_prev_a:', [x.string for x in all_prev_a])

current = soup.find('div', {'class': 'current'})

# --------------------------------------------

print('\n--- directly next\prev ---\n')

#next_direct = current.find_next(True)
next_direct = current.find_next()
print('next:', next_direct.string)
next_direct = next_direct.find_next()
print('next:', next_direct.string)
next_direct = next_direct.find_next()
print('next:', next_direct.string)

#prev_direct = current.find_previous(True)
prev_direct = current.find_previous()
print('prev:', prev_direct.string)
prev_direct = prev_direct.find_previous()
print('prev:', prev_direct.string)
prev_direct = prev_direct.find_previous()
print('prev:', prev_direct.string)

Wynik:

--- next ---

next_a: 1
next_a: 2
next_x: X
all_next_a: ['1', '2']

--- prev ---

prev_a: -1
prev_a: -2
prev_y: Y
all_prev_a: ['-1', '-2']

--- directly next\prev ---

next: 1
next: 2
next: X
prev: -1
prev: -2
prev: Y

If you like it
Buy a Coffee