我正试图从以下网页抓取可用的公寓列表: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):
这不是一个有效的解决方案,因为我正在寻求自动化这个过程。
如何以编程方式从网页中获取此动态生成的内容?
答案 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页面。