如何使用Selenium和BeautifulSoup4获取HTML iframe内的数据
提取Statbel公开统计仪表盘数据的可行方案
失败原因说明
你之前用Selenium和BeautifulSoup4失败,核心原因是该页面的统计仪表盘是嵌入的Power BI动态iframe,数据为异步加载:
- BeautifulSoup只能拿到父页面的静态HTML,无法获取iframe内部的动态渲染内容
- 若Selenium未切换到iframe上下文、未等待内容完全加载,也无法定位到内部元素
方案1:Selenium正确操作iframe(适合少量数据提取)
按以下步骤实现即可拿到渲染后的页面数据:
- 打开目标页面后,先等待iframe元素完全加载,避免提前操作返回空值
- 调用Selenium的
switch_to.frame()方法切入iframe上下文,才能访问内部DOM - 等待iframe内部的图表、数值组件全部渲染完成后,再定位对应元素提取内容
- 操作完成后调用
switch_to.default_content()切回父页面上下文
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://statbel.fgov.be/fr/commune/silly#dashboard1") wait = WebDriverWait(driver, 20) # 定位并切入Power BI iframe iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[title*='Power BI']"))) driver.switch_to.frame(iframe) # 定位你需要的统计数据元素,示例为提取人口相关数值 target_elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "text[aria-label*='population']"))) print("提取到的统计值:", target_elem.text) # 切回父页面,关闭浏览器 driver.switch_to.default_content() driver.quit()
方案2:直接抓取Power BI后端接口(适合批量、稳定提取)
该方案不需要解析页面元素,效率更高更稳定:
- 打开浏览器开发者工具的「网络」面板,筛选「XHR/ fetch」请求,刷新页面后可以找到Power BI后台拉取数据的接口,返回结果为结构化JSON格式
- 模拟该请求即可直接拿到格式化的统计数据,仅需要带上请求自动生成的公开授权令牌,不需要额外登录验证
注意事项
- 该数据为公开统计数据,非商用、低频次抓取符合网站使用规则,不要高频请求对服务器造成负担
- 若需要长期批量拉取多区域数据,可以优先查找Statbel官方开放的统计API接口,合规性和稳定性更高
内容的提问来源于stack exchange,提问作者Loic Vanderkelen
相关产品推荐
相关产品推荐

