Парсинг динамических элементов через BS4 python

Всем доброго дня!

Недавно открыл для себя чудесную библиотеку BeautifulSoup для Парсинга сайтов, однако столкнулся с одной проблемой: тот контент на сайте, что мне нужен, как мне кажется, создается только в случае посещения сайта. При инспектировании элементов на браузере виден полный html код страницы со всем контентом, однако при парсинге его и вовсе нет.

Вот такой простенький код со ссылкой на сайт есть:

from bs4 import BeautifulSoup

import requests

url = 'https://afisha.ykt.ru'
page = requests.get(url)

soup = BeautifulSoup(page.text, 'html.parser')

print(soup)

Вопрос: как в этом случае получить контент тега div с классом event?


Ответы (2 шт):

Автор решения: timur

Либо выполнять тот же запрос, что делает и сайт для получения содержимого, либо использовать selenium

https://python-scripts.com/question/7270

→ Ссылка
Автор решения: Igor

Ситуация типична: контент создаётся динамически с помощью JavaScript после загрузки страницы. Когда ты используешь requests.get(), сервер отдаёт только исходный HTML, без подгруженных через JS элементов. Поэтому тег <div class="event"> там ещё не появляется.

Нужно использовать Selenium (автоматизация браузера)

Selenium запускает настоящий браузер и ждёт, пока JavaScript загрузит контент.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time

# путь к chromedriver на твоей машине
service = Service('/path/to/chromedriver')
driver = webdriver.Chrome(service=service)

url = 'https://afisha.ykt.ru'
driver.get(url)

# даём время JS загрузить контент
time.sleep(5)  # можно заменить на явное ожидание через WebDriverWait

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

events = soup.find_all("div", class_="event")
for e in events:
    print(e.text.strip())

driver.quit()
→ Ссылка