Selenium(Python)爬取阿拉伯语动词变位表:无法访问iframe内#document
解决Online Sarf Generator爬取问题的方案
一、修复当前Selenium方法的步骤
你的问题核心是iframe切换逻辑和动态元素等待不到位,按以下步骤调整即可解决:
添加显式等待,避免页面未加载完成就操作
Google Sites加载iframe是异步过程,必须用WebDriverWait等待元素出现,不能直接硬切换或定位元素。正确嵌套切换iframe
先定位外层的Google Sites容器iframe(通常name="wrtFrame"),切换进去后再定位userHtmlFrame并完成二次切换。等待目标控件加载完成
切换到userHtmlFrame后,继续等待下拉菜单、生成按钮等元素处于可交互状态,再执行选择和点击操作。
示例代码(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 driver = webdriver.Chrome() driver.get("https://sites.google.com/view/sarfgenerator/home") try: # 等待并切换到外层Google Sites容器iframe outer_iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "wrtFrame")) ) driver.switch_to.frame(outer_iframe) # 等待并切换到userHtmlFrame user_iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "userHtmlFrame")) ) driver.switch_to.frame(user_iframe) # 等待第一个根字母下拉菜单并选择(示例选阿拉伯字母"ب") root1_dropdown = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "root1")) # 实际元素ID需用开发者工具确认 ) root1_dropdown.send_keys("ب") # 同理处理第二个、第三个根字母和词族下拉菜单 # root2_dropdown = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "root2"))) # root2_dropdown.send_keys("ك") # root3_dropdown = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "root3"))) # root3_dropdown.send_keys("ر") # family_dropdown = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "family"))) # family_dropdown.send_keys("1") # 等待并点击生成按钮 generate_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[text()='Generate Sarf Table']")) ) generate_btn.click() # 等待变位表加载后爬取内容 sarf_table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "table")) ) print(sarf_table.get_attribute("innerHTML")) finally: driver.switch_to.default_content() # 切回主文档 driver.quit()
注:代码中元素的ID为推测值,实际需通过浏览器开发者工具确认控件的真实定位标识
二、其他爬取方案
如果Selenium的iframe操作过于繁琐,推荐两种更高效的替代方式:
1. 直接抓包构造API请求
- 打开浏览器开发者工具(F12)切换到Network标签,点击“Generate Sarf Table”按钮,观察页面发送的请求。
- 分析请求的参数格式(三个根字母、词族的编码规则),用
requests库直接构造POST/GET请求,获取JSON或HTML格式的变位表数据,无需模拟浏览器操作。
2. 获取iframe的直接URL
- 通过Selenium定位
userHtmlFrame后,获取其src属性值:driver.find_element(By.ID, "userHtmlFrame").get_attribute("src")。 - 直接用
requests请求该URL,拿到页面内容后用BeautifulSoup解析控件和生成后的表格,规避多层iframe切换的麻烦。
内容的提问来源于stack exchange,提问作者Sameed_Naama
相关产品推荐
相关产品推荐

