Извлечение html исходного кода из javascript сгенерированного вывода - PullRequest
0 голосов
/ 23 февраля 2020

В настоящее время я работаю над проектом поиска пустых классных комнат в нашей школе в режиме реального времени. Для этого мне нужно извлечь замену, опубликованную на нашей школьной странице (https://ssnovohradska.edupage.org/substitution/?), Так как могут быть любые дополнительные изменения.

Но когда я пытаюсь извлечь исходный код html и проанализировать его с помощью bs4, он не может найти элементы div (класс: "section print-nobreak"), которые содержат текст подстановки. Когда я взглянул на исходный код страницы (Ctrl + U), я обнаружил, что существует только javascript, который печатает все это напрямую.

Есть ли способ извлечь html после того, как вывод javascript уже обработан?

Спасибо за помощь!

1 Ответ

0 голосов
/ 23 февраля 2020

Разбор HTML, к сожалению, необходим для решения вашей проблемы. Но я объясню, как найти способы избежать этого в ваших будущих проектах (не основанных на этом веб-сайте).

  1. Вы правильно заметили, что текст создается кодом JavaScript, работающим на стр. Это также может указывать на то, что данные либо загружаются из другого ресурса (вызов XHR / fetch, получая ответ от API), либо сохраняются в виде JSON / JS внутри кода веб-сайта. (Или генерируется из алгоритма, но это вряд ли имеет место на таких веб-сайтах.)
  2. Веб-сайт фактически использует оба метода (первоначальный рендеринг получает данные, хранящиеся в коде веб-сайта, но при переключении дат в календаре это делает AJAX запросов). Вы можете увидеть это, выполнив поиск ReactDOM.render(React.createElement( в коде. Они предоставляют строку HTML для вызова createElement, поэтому я бы посоветовал изучить AJAX способ ведения дел.
  3. Теперь, чтобы проверить, где находится ресурс, все, что вам нужно сделать открывает Инструменты разработчика в вашем любимом браузере (обычно Control + Shift + I) и переходит на вкладку Сеть. Теперь, когда ваша сетевая вкладка открыта, вам нужно заставить веб-сайт загружать внешние данные, например, нажав дату на «панели календаря».
  4. Здесь вы заметите много внешних запросов, но мы ' на самом деле ищет только звонки XHR. Нажмите на кнопку XHR рядом с текстовым полем «Фильтр». Это должно привести к отображению только одного запроса:

Request

К сожалению для нас, ответ содержит только HTML. Кроме того, вызовы API защищены - они требуют PHP идентификатора сеанса и какого-то токена (__gsh), чтобы не дать сбой. Итак, возвращаясь к шагу 1 - кажется, что наше единственное решение - использовать регулярные выражения для поиска текста между "report_html":"<div class и </div></div></div> из исходного кода, если вас интересует только сегодняшняя дата. Если вы хотите получить содержимое на завтра или на любую другую дату - вам нужно будет либо извлечь страницу, сохранить куки и найти токен для запроса, а затем сделать этот запрос, либо использовать что-то вроде puppeteer или pyppeteer (так как вы упомянули BS4) и загрузите веб-страницу в этом. Если вы не делаете выборку данных так часто, у вас все будет в порядке.
...