Для этого я бы не стал использовать Selenium. Не то чтобы вы не могли, но сайт имеет статус c, и вы можете сразу получить исходный код html с requests
. Так что это немного растянуто, поскольку вы начинаете с BeautifulSoup, но если вы откроете Инструменты разработчика (Ctrl-Shift-I) и перезагрузите страницу, вы заметите запросы, сделанные на правой панели в разделе Сеть -> XHR. Для GetNutritionalDetails есть реквизит.
Там вы увидите URL-адрес запроса, заголовки запросов и полезную нагрузку внизу. Вы также увидите, что это запрос POST
(обычно вы используете GET
.
Данные находятся в списке (<li>
теги). Так что дело не только в том, чтобы получить все эти теги, а затем перебрать каждый из них, чтобы извлечь другие данные.
Вы можете добавить эти данные в список, а затем этот список в таблица / фрейм данных с pandas.
Код:
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'http://smartlabel.generalmills.com/GTIN/GetNutritionalDetails'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
payload = {
'id': '41196891218',
'servingSize': 'AS PACKAGED'}
response = requests.post(url, headers=headers, params=payload)
soup = BeautifulSoup(response.text, 'html.parser')
listItems = soup.find_all('li')
labels = []
gramValues = []
percValues = []
for each in listItems:
label = each.find('label').text.strip()
if label == 'Includes':
label += ' Added Sugar'
gram = each.find('span', {'class':'gram-value'}).text.strip()
if each.find('span', {'class':'dv-result'}):
perc = each.find('span', {'class':'dv-result'}).text.strip()
else:
perc = ''
labels.append(label)
gramValues.append(gram)
percValues.append(perc)
df = pd.DataFrame({
'Label':labels,
'Grams':gramValues,
'Percent':percValues})
Вывод:
print (df)
Label Grams Percent
0 Total Fat 1 g 1 %
1 Saturated Fat 0 g 0 %
2 Trans Fat 0 g
3 Cholesterol 0 mg 0 %
4 Sodium 810 mg 35 %
5 Total Carbohydrate 17 g 6 %
6 Dietary Fiber 2 g 6 %
7 Total Sugar 2 g
8 Includes Added Sugar 2 g 3 %
9 Protein 4 g
10 Vitamin D 0 ?g 0 %
11 Calcium 60 mg 4 %
12 Iron 1.2 mg 6 %
13 Potassium 0 mg 0 %