Я пытаюсь очистить доступные списки квартир со следующей веб-страницы: https://3160599v2.onlineleasing.realpage.com/
Я использую реализацию Selenium на Python, но до сих пор я не нашел эффективного решения для программного получения контента. Самый простой код - это следующий, который в настоящее время просто возвращает нединамический исходный HTML-код:
from selenium import webdriver
driver = webdriver.Chrome('/path_to_driver')
driver.get('https://3160599v2.onlineleasing.realpage.com/')
html = driver.page_source
html
переменная html
не содержит нужных мне квартир.
Если "Проверить" элемент с помощью встроенного средства проверки Chrome, я вижу, что содержимое находится в пределах <iframe frameborder="0" realpage-oll-widget="RealPage-OLL-Widget" style="width: 940px; border: none; overflow: hidden; height: 2251px;"></iframe>
iframe: <iframe frameborder="0" realpage-oll-widget="RealPage-OLL-Widget" style="width: 940px; border: none; overflow: hidden; height: 2251px;"></iframe>
Несколько детей в этом iframe вы также можете увидеть div <div class="main-content">
который содержит всю необходимую мне информацию.
Другие решения, которые я попытался, включают реализацию явного WebDriverWait:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, 'main-content')))
Я получаю исключение TimeoutException с помощью этого метода, поскольку элемент никогда не найден.
Я также пробовал использовать метод driver.switch_to.frame()
, без успеха.
Единственные шаги, которые фактически позволили мне получить списки квартир на веб-странице, были (с помощью Chrome):
Это не эффективное решение, так как я пытаюсь автоматизировать этот процесс.
Как я могу получить этот динамически созданный контент с веб-страницы программным способом?
Попробуйте использовать ниже код для переключения на iframe:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_xpath('//iframe[@realpage-oll-widget="RealPage-OLL-Widget"]')))
Также обратите внимание, что метод, который позволяет переключиться на статический iframe
это switch_to.frame()
, но не switch-to.frame()
Вы не можете напрямую видеть содержимое, которое находится в iframe. Вам нужно изменить рамку. Вы можете сделать это, сначала выбрав "iframe element", а затем переключитесь на него с driver.switch_to.frame()
функции driver.switch_to.frame()
.
iframe = driver.get_element_by_id('iframe')
driver.switch_to.frame(iframe)
После этого вы можете получить доступ к содержимому iframe.
Кроме того, вы можете взять исходный атрибут iframe, а затем перейти на эту страницу с помощью селена. В конце концов, iframe-контент - это другая html-страница.
@id
пример HTML показывает, что у iframe нет @id
, поэтому ваш код не будет работать. В случае, если в iframe есть @id
iframe = driver.get_element_by_id('iframe')
абсолютно избыточна, так как вы можете переключиться на фрейм напрямую с помощью @id
с помощью driver.switch_to.frame("iframe_id")
WebDriverException: Message: unknown error: call function result missing 'value' (Session info: chrome=66.0.3359.181) (Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.6 x86_64)
Также отредактировал вопрос, чтобы исправить ошибку приswitch-to
, спасибо.