Тут нужен selenium, с ним можно нажимать копки и управлять страницей как с обычного браузера
Вот примеры с css selector и id
Но нужно быть осторожным, selenium не позволяет нормально отследить прогрузку страницы, поэтому используйте sleep или WebDriverWait если знаете, какой элемент ищете
Примеры для сайта
https://dbkpop.com/db/all-k-pop-idols, не знаю как сейчас, но раньше работали
def expand_table(self):
css = "button.btn.dropdown-toggle.btn-default"
self.driver.execute_script(f"document.querySelector('{css}').scrollIntoView();")
button = self.driver.find_elements_by_css_selector(css)
if button:
button[0].click()
button_all = self.driver.find_elements_by_link_text("All")
button_all[0].click()
time.sleep(30)
def accept_cookie(self):
try:
cn = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.ID, "cn-accept-cookie"))
)
cn.click()
except:
pass
try:
cn = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.ID, "onesignal-popover-cancel-button"))
)
cn.click()
except:
pass
time.sleep(10)
Для парсинга лучше используйте lxml или bs4 с движком lxml, он работает намного быстрее, пример с таблицей
def get_table_data(self):
self.table = self.driver.find_elements_by_id(self.table_id)[-1]
for th in self.table.find_elements_by_xpath(".//thead//tr")[0].find_elements_by_xpath(".//th"):
self.table_headers.append(th.text)
table_data = self.table.find_elements_by_xpath(".//tbody//tr")
module_logger.info(f"Founded {len(table_data)} tr in table")
for tr in table_data:
data = []
for td in tr.find_elements_by_xpath(".//td"):
in_td = td.find_elements_by_xpath(".//*")
if in_td:
in_td = in_td[-1]
if in_td.tag_name == "a":
link = in_td.get_attribute("href")
data.append(link)
else:
text = in_td.text
if text:
data.append(text)
else:
data.append(td.text)
self.table_data.append(data)