С помощью этого кода я мог бы принять файл cookie в iframe и записать основной сайт в файл output.html для отладки:
Код: Выделить всё
from selenium.webdriver import Chrome, ChromeOptionsКод: Выделить всё
from selenium.webdriver.common.by import ByКод: Выделить всё
from selenium.webdriver.support.ui import WebDriverWaitКод: Выделить всё
from selenium.webdriver.support import expected_conditions as ECКод: Выделить всё
from selenium.common.exceptions import (Код: Выделить всё
TimeoutException,Код: Выделить всё
NoSuchElementException,Код: Выделить всё
WebDriverException,Код: Выделить всё
)Код: Выделить всё
import timeКод: Выделить всё
BOOKING_URL = "https://www.prisma.de/raetsel/epaper/ra8IU0"Код: Выделить всё
def get_webdriver() -> Chrome:Код: Выделить всё
Код: Выделить всё
options = ChromeOptions()Код: Выделить всё
options.add_argument(Код: Выделить всё
"user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "Код: Выделить всё
"AppleWebKit/537.36 (KHTML, like Gecko) "Код: Выделить всё
"Chrome/124.0.0.0 Safari/537.36"Код: Выделить всё
)Код: Выделить всё
options.page_load_strategy = 'normal'Код: Выделить всё
try:Код: Выделить всё
driver = Chrome(options=options)Код: Выделить всё
return driverКод: Выделить всё
except WebDriverException as e:Код: Выделить всё
raiseКод: Выделить всё
Код: Выделить всё
def _wait_for_cookie(driver) -> None:Код: Выделить всё
Код: Выделить всё
try:Код: Выделить всё
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,'//iframe')))Код: Выделить всё
except TimeoutException:Код: Выделить всё
print("Timeout waiting for cookie.")Код: Выделить всё
try:Код: Выделить всё
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(., 'Einwilligen')]"))).click()Код: Выделить всё
except TimeoutException:Код: Выделить всё
print("Timeout waiting for cookie.")Код: Выделить всё
time.sleep(3)Код: Выделить всё
driver.switch_to.default_content()Код: Выделить всё
with open("output.html", "w", encoding="utf-8") as f:Код: Выделить всё
f.write(driver.page_source) Код: Выделить всё
print (driver.find_elements(By.XPATH,"//div[contains(., 'k-board k-board--html')]"))Код: Выделить всё
Код: Выделить всё
def check_riddle(url: str = BOOKING_URL) -> bool:Код: Выделить всё
Код: Выделить всё
driver = NoneКод: Выделить всё
try:Код: Выделить всё
driver = get_webdriver()Код: Выделить всё
Код: Выделить всё
driver.get(url)Код: Выделить всё
print(driver.current_url)Код: Выделить всё
Код: Выделить всё
time.sleep(5)Код: Выделить всё
_wait_for_cookie(driver)Код: Выделить всё
except Exception as exc: Код: Выделить всё
print("Error during riddle check: %s", exc)Код: Выделить всё
raiseКод: Выделить всё
finally:Код: Выделить всё
if driver:Код: Выделить всё
try:Код: Выделить всё
driver.quit()Код: Выделить всё
print("WebDriver closed.")Код: Выделить всё
except Exception as exc:Код: Выделить всё
print("Error closing WebDriver: %s", exc)Код: Выделить всё
Код: Выделить всё
Код: Выделить всё
if __name__ == "__main__":Код: Выделить всё
check_riddle()Как найти нужный div-контейнер на сайте? После этого я могу преобразовать поля и число в строку судоку.
[![Пример изображения веб-браузера][1]][1]
[1]: https://i.sstatic.net/3K6Ii8wl.jpg
В функции check_riddle также есть не очень приятный таймаут в 5 секунд, потому что в противном случае веб-сайт не будет полностью загружен. Может быть, кто-нибудь подскажет мне, как это сделать лучше.
Спасибо большое.
BR ками
Подробнее здесь: https://stackoverflow.com/questions/798 ... me-in-html
Мобильная версия