Парсинг динамических элементов через 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 шт):
Либо выполнять тот же запрос, что делает и сайт для получения содержимого, либо использовать selenium
Ситуация типична: контент создаётся динамически с помощью 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()