Как вы очищаете (с Python) веб-сайт, который не отформатирован как таблица? - PullRequest
0 голосов
/ 15 марта 2020

Я хочу почистить этот веб-сайт Различные типы пива с использованием BeautifulSoup и вернуть каждый тип пива, ABV каждого и часть «Пары с». После очистки я собираюсь поместить все эти значения в таблицу, где я могу взять пользовательский ввод, чтобы отфильтровать его и вернуть рекомендации пива для пользователя, основываясь на его кухне и предпочтениях ABV.

Я пробовал много разных подходов, но не могу понять это вообще. Пока я могу получить только следующее:

import requests
from bs4 import BeautifulSoup 
import pandas as pd
import csv

r = requests.get("https://www.webstaurantstore.com/article/27/different-types-of-beers.html")
soup = BeautifulSoup(r.text, "html.parser")
beer_titles = soup.find_all('h3')[3:-1]
beer_titles_list = []
for b in beer_titles:
    result = b.text.strip()
    beer_titles_list.append(result)
beer_titles_list

Это правильно определяет названия пива, но я не могу найти значения ABV и "Pairs with".

Я не обязательно ищу точный ответ, потому что я понимаю, что предстоит еще много работы. Я больше просто ищу какие-либо советы или способы изменить / добавить мой код, который приведет меня к моей цели.

1 Ответ

0 голосов
/ 15 марта 2020

Вам нужно взглянуть на 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...