Все «под» каждым H2

#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, но идея связать их — затем использовать логику «не» и т. Д. — умна…и практична!