Python 获取动态 iframe 内容(完整解决方案)

动态 iframe 指内容由 JavaScript 异步加载 的 iframe,普通的 requests + BeautifulSoup 无法获取,因为它们只能爬取静态 HTML,不执行 JS。

最佳方案:使用 Selenium(自动渲染 JS)

Selenium 可以模拟浏览器,等待 iframe 加载完成后再获取内容,100% 适配动态 iframe

步骤 1:安装依赖

bash 复制代码
pip install selenium webdriver-manager

步骤 2:完整可运行代码

python 复制代码
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
from webdriver_manager.chrome import ChromeDriverManager
import time

# 1. 初始化浏览器(自动下载驱动,无需手动配置)
driver = webdriver.Chrome(ChromeDriverManager().install())

# 2. 打开目标网页
driver.get("https://你的目标网址.com")

# 3. 等待 iframe 加载完成(关键:解决动态加载问题)
wait = WebDriverWait(driver, 15)  # 最多等待15秒
iframe = wait.until(
    EC.presence_of_element_located((By.TAG_NAME, "iframe"))  # 定位 iframe
)

# 4. 切换到 iframe 内部(必须切换,否则拿不到内容)
driver.switch_to.frame(iframe)

# 5. 获取 iframe 内的完整 HTML 内容
iframe_content = driver.page_source
print("=== iframe 动态内容 ===")
print(iframe_content)

# 6. 也可以直接提取 iframe 内的元素(示例)
# 提取文本
text = driver.find_element(By.TAG_NAME, "body").text
print("\n=== iframe 内文本 ===")
print(text)

# 7. 退出 iframe,回到主页面(可选)
driver.switch_to.default_content()

# 8. 关闭浏览器
driver.quit()

进阶用法(精准定位 iframe)

如果页面有多个 iframe ,不要用 TAG_NAME,改用以下方式定位:

python 复制代码
# 1. 通过 id 定位
iframe = wait.until(EC.presence_of_element_located((By.ID, "iframe_id")))

# 2. 通过 class 定位
iframe = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "iframe_class")))

# 3. 通过 XPath 定位(最通用)
iframe = wait.until(EC.presence_of_element_located((By.XPATH, '//iframe[@src="目标地址"]')))

轻量方案:Playwright(比 Selenium 更快)

如果觉得 Selenium 慢,推荐微软的 Playwright,自动等待动态内容,代码更简洁。

安装

bash 复制代码
pip install playwright
playwright install

代码

python 复制代码
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://你的目标网址.com")
    
    # 等待 iframe 并切换
    iframe = page.frame_locator("iframe")
    # 获取 iframe 内的内容
    content = iframe.locator("body").text_content()
    
    print(content)
    browser.close()

核心知识点(必看)

  1. 动态 iframe 必须用浏览器渲染:requests 无法执行 JS,永远拿不到内容。
  2. 必须切换到 iframe :不执行 switch_to.frame(),只能拿到主页面内容。
  3. 必须等待加载 :动态内容需要时间,用 WebDriverWait 等待,不要用 time.sleep()

总结

  1. 首选 Selenium:兼容性最好,适合新手;
  2. 次选 Playwright:速度更快,代码极简;
  3. 静态 requests 方案完全无效,不要浪费时间。
相关推荐
weixin_428005302 分钟前
C#调用 AI学习从0开始-第2阶段(Function Calling+工具调用智能体)-第9天实战-实现计算器工具
开发语言·学习·c#·functioncalling·ai实现计算器工具
特种加菲猫21 分钟前
C++11核心特性深度解析:从列表初始化到lambda与包装器
开发语言·c++
JSMSEMI1126 分钟前
JSM12N60C 600V N沟道增强型功率MOSFET
开发语言·javascript·ecmascript
设计师小聂!26 分钟前
Java异常处理
java·开发语言·后端·编辑器·idea
清水白石00829 分钟前
从打印对象到高质量调试:彻底理解 Python 中 `__repr__` 和 `__str__` 的区别
开发语言·python
枕星而眠35 分钟前
C++ 面向对象核心机制深度解析:多态性、虚函数、虚继承与 final 类
运维·开发语言·c++·后端
Sammyyyyy41 分钟前
Google I/O 2026 Antigravity 更新解析与 SDK 实战指南
python·ai编程·servbay
Evand J1 小时前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制
爱装代码的小瓶子1 小时前
3. 设计buffer模块
linux·服务器·开发语言·c++·php
郝学胜-神的一滴1 小时前
Qt 高级开发 027: QTabWidget自定义样式表美化实战
开发语言·c++·qt·程序人生·软件构建·用户界面