Python Selenium: получение динамического контента в iframe

2

Я пытаюсь очистить доступные списки квартир со следующей веб-страницы: 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):

  1. Вручную щелкните правой кнопкой мыши элемент списка на веб-странице.
  2. Нажмите "Осмотр"
  3. Найдите основной контент div '
  4. Вручную щелкните этот div правой кнопкой мыши и выберите "Копировать" → "Копировать элемент"

Это не эффективное решение, так как я пытаюсь автоматизировать этот процесс.

Как я могу получить этот динамически созданный контент с веб-страницы программным способом?

Теги:
web-scraping
selenium
dynamic

2 ответа

0
Лучший ответ

Попробуйте использовать ниже код для переключения на 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()

  • 0
    Выполнение вашего кода в настоящее время возвращает следующую ошибку: 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 , спасибо.
  • 0
    Следуя вышесказанному, я запустил устаревшую версию веб-драйвера. Запустил ваш код с последней версией, и это сработало! Спасибо, Андерссон!
0

Вы не можете напрямую видеть содержимое, которое находится в 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-страница.

  • 0
    @id пример HTML показывает, что у iframe нет @id , поэтому ваш код не будет работать. В случае, если в iframe есть @id iframe = driver.get_element_by_id('iframe') абсолютно избыточна, так как вы можете переключиться на фрейм напрямую с помощью @id с помощью driver.switch_to.frame("iframe_id")
  • 0
    Я не думал, что это было в изобилии, так как оно более многословно и не так длинно, но это не совсем решает вопрос, так что это неправильный ответ. Спасибо за ответ, который вы даете, хотя, я не знал таким образом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню