Мне не очень понятен ответ, который я получаю здесь. Выглядит незавершенным. Мне было интересно, неправильный ли это подход и следует ли переключиться на селен. Я пытаюсь получить все пункты меню вместе с ценами и надстройками здесь. Я просто проверял ответ. Любое руководство было бы очень полезно. Спасибо
import requests
from bs4 import BeautifulSoup
url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987&lng=77.5945627&menuId=41100'
page = requests.get(url).json()
for k, v in page.items():
print(v)
Что происходит?
Думайте, что это не вопрос request
против selenium
для парсинга веб-страниц, потому что все, что вы делаете, это запрашиваете API и получаете json
ответ.
И ваш код отлично работает так, как он написан, но то, что вы ожидаете сделать, это что-то другое, поэтому вам нужно иметь дело с итерацией dict
по-другому.
Это поможет:
page['data']['menu']['items'].items()
Пример
import requests
url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987&lng=77.5945627&menuId=41100'
page = requests.get(url).json()
for k, v in page['data']['menu']['items'].items():
print(v)
Выход
{'id': 8194821, 'name': 'Egg Omelette', 'category': 'Quick Bites', 'description': '', 'cloudinaryImageId': '', 'recommended': 0, 'inStock': 0, 'isVeg': 0, 'enabled': 1, 'displayOrder': 0, 'price': 8500, 'variants_new': {'exclude_list': [], 'variant_groups': []}, 'addons': [{'group_id': 21778839, 'group_name': 'Addons', 'choices': [{'id': 17471659, 'name': 'Watermelon Juice', 'price': 10000, 'inStock': 0, 'isVeg': 1, 'order': 1, 'default': 0}, {'id': 17471658, 'name': 'Coke (750 ml)', 'price': 6000, 'inStock': 1, 'isVeg': 1, 'order': 1, 'default': 0}], 'maxAddons': -1, 'maxFreeAddons': -1, 'minAddons': 0, 'order': 1}, {'group_id': 21778838, 'group_name': 'Beverage Addons', 'choices': [{'id': 17471658, 'name': 'Coke (750 ml)', 'price': 6000, 'inStock': 1, 'isVeg': 1, 'order': 1, 'default': 0}], 'maxAddons': -1, 'maxFreeAddons': -1, 'minAddons': 0, 'order': 1}], 'cropChoices': 2, 'itemScore': 0, 'itemDiscount': 0, 'isPopular': 0, 'restId': '41100', 'showMC': 0, 'ribbon': {'text': 'Must Try', 'textColor': '#ffffff', 'topBackgroundColor': '#d53d4c', 'bottomBackgroundColor': '#b02331'}, 'attributes': {'portionSize': '', 'vegClassifier': 'EGG', 'accompaniments': ''}, 'itemNudgeType': ''}
{'id': 8194822, 'name': 'Paneer Sholey', 'category': 'Starters', 'description': 'Fried cottage cheese cubes, tossed in signature spices & curry leaves garnish.', 'cloudinaryImageId': '', 'recommended': 0, 'inStock': 0, 'isVeg': 1, 'enabled': 1, 'displayOrder': 0, 'price': 22000, 'variants_new': {'exclude_list': [], 'variant_groups': []}, 'cropChoices': 2, 'itemScore': 0, 'itemDiscount': 0, 'isPopular': 0, 'restId': '41100', 'showMC': 0, 'attributes': {'portionSize': '', 'vegClassifier': 'VEG', 'accompaniments': ''}, 'itemNudgeType': ''}
...
Благодарю за ваш ответ. Если бы вы могли просто взглянуть на ответ выше. Я как бы ищу это только с описанием Блюда. Я слаб с json
. Очень признателен,
Чтобы получить только описание, сделайте так: print(v.get('description'))
вместо print(v)
возвращает None
..Мы используем get
?
Это сработало. ` print("Описание: {}".format(v["описание"]))`
Вы можете использовать оба, это зависит от того, что вы делали раньше :for k,v in page['data']['menu']['items'].items(): print(v['description'])
Ах!.. Спасибо за информацию. Я могу принять только 1 ответ, иначе я бы принял оба. Ваш и другой очень помогли мне понять, как получить элементы внутри этих диктов. Проголосовал!.Еще раз спасибо.
Чтобы разобраться с json и попытаться найти значение для ключа, скрытого на нескольких уровнях вложенности, перейдите по этой ссылке. В середине страницы есть хороший фрагмент кода для определения значения ключа независимо от того, насколько глубоко он вложен. hackersandslacckers.com/extract-data-from-complex-json-python Хотя будьте осторожны с дубликатами ключей, потому что он вернет значения для всех из них. Также не идеально передавать через нее целую страницу с точки зрения скорости, поэтому, если вы можете извлечь один из нижних вложенных уровней ближе к тому месту, где, по вашему мнению, находится ключ, это будет быстрее.
Попробуй это:
import requests
url = 'https://www.swiggy.com/dapi/menu/v4/full?lat=12.9715987&lng=77.5945627&menuId=41100'
page = requests.get(url).json()
menu_items = page["data"]["menu"]["items"]
for k, v in menu_items.items():
print("Name: {}".format(v["name"]))
print("Description: {}".format(v["description"]))
print("Price: {}".format(v["price"]))
if "addons" in v.keys():
for i in v["addons"]:
print("\t{}".format(i["group_name"]))
for j in i["choices"]:
print("\t\tName: {}".format(j["name"]))
print("\t\tPrice: {}".format(j["price"]))
print()
print()
Благодарю за ваш ответ. Всего один вопрос. Могу я получить описание блюда, кажется, я видел его в ответе. Просто я не очень хорошо разбираюсь в json
.
Кстати, переменная page — это просто вложенный словарь.
На первый взгляд, это не вопрос
request
vsselenium
. Не могли бы вы улучшить свой вопрос и предоставить ожидаемый результат, пожалуйста.