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
Notes:
Stackoverflow: How to get a especif class after other especific class in python with beautiful soup?
Buy a Coffee