Search on blog:

Python: How to find element next after (previous before) another element with BeautifulSoup.

BeautifulSoup has many functions to search elements - not only find() and find_all() but also

It can also search in other direction using

It has also attributes (for single element)

and iterators (for many elements)

which can work different then functions.

In example code I can use find() to get div with current and later use find_next() to search next element(s) or find_previous() to search previous element(s).

Using options like class, id, etc. it doesn't have to give directly next/previous element but first element which matches options.

To get exactly next/previous you can use True in place of tag find_next(True), find_previous(True), etc. or even use without tag find_next(), find_previous(), etc.

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)

Result:

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