Разбор HTML, к сожалению, необходим для решения вашей проблемы. Но я объясню, как найти способы избежать этого в ваших будущих проектах (не основанных на этом веб-сайте).
- Вы правильно заметили, что текст создается кодом JavaScript, работающим на стр. Это также может указывать на то, что данные либо загружаются из другого ресурса (вызов XHR / fetch, получая ответ от API), либо сохраняются в виде JSON / JS внутри кода веб-сайта. (Или генерируется из алгоритма, но это вряд ли имеет место на таких веб-сайтах.)
- Веб-сайт фактически использует оба метода (первоначальный рендеринг получает данные, хранящиеся в коде веб-сайта, но при переключении дат в календаре это делает AJAX запросов). Вы можете увидеть это, выполнив поиск
ReactDOM.render(React.createElement(
в коде. Они предоставляют строку HTML для вызова createElement, поэтому я бы посоветовал изучить AJAX способ ведения дел. - Теперь, чтобы проверить, где находится ресурс, все, что вам нужно сделать открывает Инструменты разработчика в вашем любимом браузере (обычно Control + Shift + I) и переходит на вкладку Сеть. Теперь, когда ваша сетевая вкладка открыта, вам нужно заставить веб-сайт загружать внешние данные, например, нажав дату на «панели календаря».
- Здесь вы заметите много внешних запросов, но мы ' на самом деле ищет только звонки XHR. Нажмите на кнопку XHR рядом с текстовым полем «Фильтр». Это должно привести к отображению только одного запроса:
![Request](https://i.stack.imgur.com/QF8jw.png)
К сожалению для нас, ответ содержит только HTML. Кроме того, вызовы API защищены - они требуют PHP идентификатора сеанса и какого-то токена (
__gsh
), чтобы не дать сбой. Итак, возвращаясь к шагу 1 - кажется, что наше единственное решение - использовать регулярные выражения для поиска текста между
"report_html":"<div class
и
</div></div></div>
из исходного кода, если вас интересует только сегодняшняя дата. Если вы хотите получить содержимое на завтра или на любую другую дату - вам нужно будет либо извлечь страницу, сохранить куки и найти токен для запроса, а затем сделать этот запрос, либо использовать что-то вроде
puppeteer или
pyppeteer (так как вы упомянули BS4) и загрузите веб-страницу в этом. Если вы не делаете выборку данных так часто, у вас все будет в порядке.