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

Selenium(Python)爬取阿拉伯语动词变位表:无法访问iframe内#document

解决Online Sarf Generator爬取问题的方案

一、修复当前Selenium方法的步骤

你的问题核心是iframe切换逻辑和动态元素等待不到位,按以下步骤调整即可解决:

  1. 添加显式等待,避免页面未加载完成就操作
    Google Sites加载iframe是异步过程,必须用WebDriverWait等待元素出现,不能直接硬切换或定位元素。

  2. 正确嵌套切换iframe
    先定位外层的Google Sites容器iframe(通常name="wrtFrame"),切换进去后再定位userHtmlFrame并完成二次切换。

  3. 等待目标控件加载完成
    切换到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:56:13