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

时间:2018-05-20 16:07:39

标签: python html selenium dynamic web-scraping

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

如果我&#39;检查&#39;使用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&#39;主要内容&#39;
  4. 手动右键单击此div并选择复制 - &gt;复制元素
  5. 这不是一个有效的解决方案,因为我正在寻求自动化这个过程。

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

2 个答案:

答案 0 :(得分:1)

尝试使用以下代码切换到iframe:

cannot be cast to scala.Function1

另请注意,允许切换为静态df.withColumn("new column", test2_udf(col("green").cast("double"),col("green").cast("double"),col("green").cast("double"))).show(false) //java.lang.ClassCastException: A$A31$A$A31$$anonfun$test2_udf$1 cannot be cast to scala.Function3 的方法为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

答案 1 :(得分:-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页面。