#python #html #beautifulsoup #siblings
#python #html #beautifulsoup #siblings
Вопрос:
Во-первых: я понимаю lt;pgt;s
, что на самом деле они не «под» lt;h2gt;s
, но здесь являются братьями и сестрами. Мне просто нужно было донести эту идею в Названии.
Мой пример HTML выглядит следующим образом:
lt;h1gt;Wildlife near melt;/h1gt; lt;h2gt;Animalslt;/h2gt; lt;pgt;Here are some animals.lt;/pgt; lt;p class="wildlife"gt;Grey Kangaroolt;/pgt; lt;pgt;A bit about kangarooslt;/pgt; lt;p class="wildlife"gt;Koalalt;/pgt; lt;pgt;These are NOT bears!lt;/pgt; lt;h2gt;Snakeslt;/h2gt; lt;pgt;These can be very dangerous! Always take carelt;/pgt; lt;p class="wildlife"gt;Eastern Brownlt;/pgt; lt;pgt;A very aggressive and venomous snakelt;/pgt; lt;pgt;A link here to an ad, so we don't want this bitlt;/pgt;
Я пытался использовать BeautifulSoup для создания списка (да, уценка,но здесь это не имеет значения), который является просто «ключевой» информацией, что-то вроде:
# Animals ## Grey Kangaroo A bit about kangaroos ## Koala These are NOT bears! # Snakes ## Eastern Brown A very aggressive and venomous snake
Как мне получить все lt;p class="wildlife"gt;Grey Kangaroolt;/pgt;
, и это следующий брат … для каждого из h2s? Я пробовал это:
for h2 in soup.find_all('h2'): print("#### ",h2.text) x = h2.find_next_siblings('p', class_='wildlife') for item in x: print("*",item.text,"*",sep="") print(item.find_next_sibling('p').text) print(" ") print("---")
Но это слишком «глубоко» для этого первого (добавление данных 2-го), затем выполняется 2-й H2.
#### Animals *Grey Kangaroo* A bit about kangaroos *Koala* These are NOT bears! *Eastern Brown* A very aggressive and venomous snake --- #### Snakes *Eastern Brown* A very aggressive and venomous snake ---
Can this be done? Thank you.
Ответ №1:
Мне нравится dicts
хранить структурированную информацию, которую можно повторно использовать в последующей обработке.
Поэтому я выбираю все lt;pgt;
с class
именем .wildlife
и повторяю find_previous('h2')
find_next('p')
и сохраняю информацию в data
:
data = {} for w in soup.select('h2~.wildlife'): if w.find_previous('h2').text not in data: data[w.find_previous('h2').text] = [] data[w.find_previous('h2').text].append({ 'animal' : w.text, 'note' : w.find_next('p').text })
Теперь вы можете обрабатывать данные так, как вам нравится:
for x in data: print('# ' x) for a in data[x]: print('## ' a['animal']) print(a['note']) print('------------------')
Пример
import requests from bs4 import BeautifulSoup html=''' lt;h1gt;Wildlife near melt;/h1gt; lt;h2gt;Animalslt;/h2gt; lt;pgt;Here are some animals.lt;/pgt; lt;p class="wildlife"gt;Grey Kangaroolt;/pgt; lt;pgt;A bit about kangarooslt;/pgt; lt;p class="wildlife"gt;Koalalt;/pgt; lt;pgt;These are NOT bears!lt;/pgt; lt;h2gt;Snakeslt;/h2gt; lt;pgt;These can be very dangerous! Always take carelt;/pgt; lt;p class="wildlife"gt;Eastern Brownlt;/pgt; lt;pgt;A very aggressive and venomous snakelt;/pgt; lt;pgt;A link here to an ad, so we don't want this bitlt;/pgt; ''' soup = BeautifulSoup(html, 'lxml') data = {} for w in soup.select('h2~.wildlife'): if w.find_previous('h2').text not in data: data[w.find_previous('h2').text] = [] data[w.find_previous('h2').text].append({ 'animal' : w.text, 'note' : w.find_next('p').text }) for x in data: print('# ' x) for a in data[x]: print('## ' a['animal']) print(a['note']) print('------------------')
Выход
# Animals ## Grey Kangaroo A bit about kangaroos ## Koala These are NOT bears! ------------------ # Snakes ## Eastern Brown A very aggressive and venomous snake ------------------
Редактировать
Если вам просто нравится печатать напрямую, вы можете пойти с:
data = [] for w in soup.select('.wildlife'): h2 = w.find_previous('h2').text if h2 not in data: data.append(h2) print('------------------') print('# ' h2) print ('## ' w.text) print(w.find_next('p').text)
Комментарии:
1. Ага, это здорово. Большое вам спасибо за то, что вы не просто дали ответ, но и объяснили «почему». Я не разработчик, но балуюсь. Я знаю словари и немного о BeautifulSoup, но идея связать их — затем использовать логику «не» и т. Д. — умна…и практична!