Python Selenium:在iframe中获取动态内容

Python Selenium:在iframe中获取动态内容,python,html,selenium,dynamic,web-scraping,Python,Html,Selenium,Dynamic,Web Scraping,我正试图从以下网页中获取可用的公寓列表: 我正在使用Selenium的Python实现,但到目前为止,我还没有找到一个有效的解决方案来以编程方式获取内容。我最基本的代码如下,目前只返回非动态HTML源代码: from selenium import webdriver driver = webdriver.Chrome('/path_to_driver') driver.get('https://3160599v2.onlineleasing.realpage.com/') html = dr

我正试图从以下网页中获取可用的公寓列表:

我正在使用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
变量不包含我需要的公寓列表

如果我使用Chrome的内置检查工具“检查”元素,我可以看到内容在未分类的iframe中:

在这个iframe中,您还可以看到div
,其中包含我需要的所有信息

我尝试过的其他解决方案包括实现显式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):

  • 在网页中的列表元素上手动右键单击
  • 点击检查
  • 查找div“主要内容”
  • 手动右键单击此div并选择“复制->复制元素”
  • 这不是一个有效的解决方案,因为我正在寻求自动化这个过程


    如何以编程方式从网页中获取动态生成的内容?

    您无法直接看到iframe中的内容。你需要换个相框。您可以先选择“iframe元素”,然后使用
    driver切换到它。切换到.frame()
    函数

    iframe = driver.get_element_by_id('iframe')
    driver.switch_to.frame(iframe)
    
    之后,您可以访问iframe的内容


    或者,您可以使用iframe的source属性,然后使用selenium转到该页面。最后,iframe内容是另一个html页面。

    尝试使用以下代码切换到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
    的方法是
    切换到.frame()
    ,而不是
    切换到.frame()

    提供的HTML示例显示iframe没有
    @id
    ,因此您的代码将无法工作。如果iframe有一个
    @id
    这一行
    iframe=driver.get\u element\u by\u id('iframe')
    是绝对冗余的,因为您可以通过
    @id
    driver.switch\u切换到.frame(“iframe\u id”)
    我不认为它是丰富的,因为它更详细,没有那么长的行,但它并不能完全解决问题,所以这是一个错误的答案。感谢您提供的答案,我不知道这种方式。运行代码当前返回以下错误:
    WebDriverException:消息:未知错误:调用函数结果缺少“值”(会话信息:chrome=66.0.3359.181)(驱动程序信息:chromedriver=2.30.477690(c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.6 x86_64)
    另外,编辑了问题以更正
    切换到
    错误,谢谢。根据上面的说明,我运行的是一个过时版本的webdriver。用最新版本运行了你的代码,它成功了!谢谢你,安德森!