Вам нужно взглянуть на HTML и решить, как найти нужные вам элементы. В случае с этим сайтом вы узнали, как найти заголовки с помощью тега H3
. Другие элементы находятся поблизости.
Вы можете перебирать элементы H3
, а затем использовать это для определения местоположения смежных элементов ABV
и Pairs with
. Они содержатся в элементах <p>
, которые также содержат нежелательные теги <b>
. Если у вас есть элемент H3
, вы можете продолжить поиск в сторону или вверх и вниз , если это необходимо.
BeautifulSoup также позволяет найти все текстовые элементы путем поиска NavigableString
экземпляров. Затем вы можете взять только второй элемент, который пропускает тег <b>
, что устраняет необходимость использования регулярного выражения.
Например:
import requests
from bs4 import BeautifulSoup, NavigableString
import csv
def get_text(e):
text_elements = e.find_all(text=lambda x: isinstance(x, NavigableString))
if len(text_elements) > 1:
return text_elements[1].strip()
else:
return ''
r = requests.get("https://www.webstaurantstore.com/article/27/different-types-of-beers.html")
soup = BeautifulSoup(r.text, "html.parser")
beer_titles_list = []
for beer_title in soup.find_all('h3')[3:-1]:
result = beer_title.text.strip()
p = beer_title.find_all_next('p', limit=5)
abv = get_text(p[1])
pairs_with = get_text(p[3])
beer_titles_list.append([result, abv, pairs_with])
print([result, abv, pairs_with])
Это даст вам вывод начало:
['American Lager', '3.2-4.0%', 'American cuisine, spicy food']
['German Helles', '4.8-5.6%', 'German cuisine, pork, brie']
['German Pilsner', '4.6-5.3%', 'German cuisine, poultry, fish, spicy cheese']
['Czech or Bohemian Pilsner', '4.1-5.1%', 'Spicy food, Asian cuisine, sharp cheddar cheese']