如何用Selenium抓取含嵌入式JavaScript的网页内容?
解决Selenium抓取JS渲染+iframe页面内容的问题
原脚本的核心问题
visibility_of_all_elements_located返回的是元素列表,不能直接调用get_attribute- 2秒等待时间过短,iframe及内部内容大概率还未加载完成
- 目标内容嵌套在iframe中,未切换iframe之前无法定位到内部元素
修正后的可运行脚本
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait class Demo(): def demo_get_contents(self): # 初始化Chrome浏览器 service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) driver.get('https://gloss.dliflc.edu/LessonViewer.aspx?lessonId=26143&lessonName=ger_soc434&linkTypeId=0') try: # 等待目标iframe加载完成并切换上下文 iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'contentFrame')) ) driver.switch_to.frame(iframe) # 抓取Overview模块内容 overview_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CLASS_NAME, 'gloss_Overview')) ) print("Overview内容:\n", overview_element.text) # 抓取标题"Auf dem Bahnhof" title_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.TAG_NAME, 'h1')) ) print("\n标题:", title_element.text) # 抓取Objective模块内容 objective_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CLASS_NAME, 'gloss_Objective')) ) print("\nObjective内容:\n", objective_element.text) finally: # 确保操作完成后关闭浏览器 driver.quit() demo = Demo() demo.demo_get_contents()
关键改动说明
- 切换iframe上下文:页面实际内容嵌套在
id="contentFrame"的iframe中,必须先切换到该iframe才能定位内部元素(若iframe属性变化,可通过F12开发者工具重新确认定位方式) - 延长等待时间:将等待时间调整为10秒,确保iframe及内部JS渲染的内容完全加载
- 单个元素定位:用
visibility_of_element_located替换原方法,返回单个元素对象后可直接获取文本 - 添加资源清理:通过
finally块保证浏览器无论是否报错都会正常关闭
内容的提问来源于stack exchange,提问作者ehsansemej
相关产品推荐
相关产品推荐

