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