【问题标题】:Python Selenium: Getting dynamic content within iframePython Selenium:在 iframe 中获取动态内容
【发布时间】:2018-10-30 09:34:02
【问题描述】:

我正在尝试从以下网页抓取可用的公寓列表: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 变量不包含我需要的公寓房源。

如果我使用 Chrome 的内置检查工具“检查”元素,我可以看到内容位于未分类的 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 'main-content'
  4. 手动右键单击此 div 并选择复制 -> 复制元素

这不是一个有效的解决方案,因为我正在寻求自动化这个过程。

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

【问题讨论】:

    标签: python html selenium dynamic web-scraping


    【解决方案1】:

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

    iframe = driver.get_element_by_id('iframe')
    driver.switch_to.frame(iframe)
    

    之后,您可以访问 iframe 的内容。

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

    【讨论】:

    • 提供的 HTML 示例显示 iframe 没有 @id,因此您的代码将无法工作。如果 iframe 有 @id 这条线 iframe = driver.get_element_by_id('iframe') 绝对是多余的,因为您可以通过 @iddriver.switch_to.frame("iframe_id") 直接切换到框架
    • 我不认为它很丰富,因为它更冗长并且没有那么长的行,但它并不能完全解决问题,所以这是一个错误的答案。感谢您提供的答案,但我不知道那样。
    【解决方案2】:

    尝试使用以下代码切换到 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()

    【讨论】:

    • 运行您的代码当前返回以下错误: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 错误,谢谢。
    • 按照上面的操作,我正在运行一个过时版本的 webdriver。使用最新版本运行您的代码,它工作正常!谢谢安德森!
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2022-01-09
    • 2017-11-26
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多