Невозможно очистить раскрывающееся меню с помощью BeautifulSoup и Requests - PullRequest
2 голосов
/ 08 октября 2019

Я хочу почистить страницы продукта на веб-сайте Breitling для получения различной информации.

Пример страницы: https://www.breitling.com/gb-en/watches/navitimer/b01-chronograph-46/AB0127211C1A1/

У меня возникли проблемы с очисткой материала ремешка часов, указанного в раскрывающемся списке. меню над кнопкой «ДОБАВИТЬ В СУМКУ» (в данном примере «сталь 1.4435»).

Нужный конкретный элемент:

<small class="dd-selected-description dd-desc dd-selected-description-truncated">Steel 1.4435</small>

Однако это не возвращается вответ на мой запрос GET. Ближайшим элементом к тегу <small> является элемент <div> с id='strap-selector-list'.

Однако при вызове soup.find(id='strap-selector-list') он показывает <div> как ничего не содержащее.

import requests
from bs4 import BeautifulSoup

url = 'https://www.breitling.com/gb-en/watches/navitimer/b01-chronograph-46/AB0127211C1A1/'

r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')

soup.find(id='strap-selector-list')

возвращает

<div id="strap-selector-list"></div>

Как я могу получить информациювнутри (как показано при открытии инспектора?)

Снимок экрана страницы с открытым инспектором с выделением областей интереса

Что я пробовал:

  1. Заголовки спуфинга. Я скопировал / вставил все заголовки запросов (кроме файлов cookie) на вкладке Сеть в инструментах разработчика. Я использовал их в запросе GET (только для краткости измененные строки)
headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
'cache-control': 'max-age=0',
'dnt': '1',
'referer': 'https://www.breitling.com/gb-en/watches/navitimer/?search%5Bref%5D=&search%5Bsorting%5D=newest',
'sec-fetch-mode': 'navigate, same-origin, cors',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}

r = requests.get(url, headers=headers)

Проверено XHR-запросов. Там только 3, когда страница загружается. Один для статуса корзины покупок, один дает информацию о розничных продавцах, таких как местоположение их магазинов, а другой - status.php, который выдает ошибку 404.

Если щелкнуть раскрывающееся меню, запросы XHR не отправляются.

Если щелкнуть любой из элементов в раскрывающемся меню, вы попадете на страницу продукта дляэтот элемент.

Использование разных парсеров, например, html.parser не имеет значения

Добавление файлов cookie в заголовки и выполнение обычного запроса GET, также без разницы Первое создание session = requests.Session() и выполнение r = session.get(url) с * 1053 и без него также не работает.

Любая помощь очень ценится!

1 Ответ

1 голос
/ 08 октября 2019

Данные, которые вы ищете, находятся в элементе script.

Все, что вам нужно сделать, это загрузить JSON, который возвращается как тело скрипта, и пройти через диктовку.

import requests
from bs4 import BeautifulSoup
import json
import pprint

url = 'https://www.breitling.com/gb-en/watches/navitimer/b01-chronograph-46/AB0127211C1A1/'

r = requests.get(url)
soup = BeautifulSoup(r.text, 'html')

script = soup.find(id='app-reference-versions')
pprint.pprint(json.loads(script.contents[0]))

output

https://pastebin.com/kGhMQt61

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...