You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:06:03