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

如何用Python+Selenium自动下载政府网站Excel数据?

解决Selenium无法选中政府网站按钮下载Excel的问题

针对你在澳洲昆士兰船舶交通网站(https://qships.tmr.qld.gov.au/webx/#)自动下载Excel时遇到的按钮定位失败问题,以下是具体排查和修复方案:

核心问题分析

你的代码中使用的XPath依赖静态ID或绝对路径,但这类政府网站常采用动态生成的元素ID、iframe嵌入内容,或需要等待下拉菜单展开后才能定位元素,导致原XPath失效。

具体修复步骤

1. 检查并切换iframe

该网站的核心功能区域可能嵌入在iframe中,先切换到对应iframe才能定位内部元素:

# 打开页面后,先切换到iframe(根据实际iframe的属性调整,比如ID/Name)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "webx-main-frame")))  # 替换为实际iframe的ID

2. 优化XPath定位规则

放弃依赖动态ID和绝对路径,改用文本内容、元素属性组合定位,提升稳定性:

  • Ship Movements:通过文本定位
    xpath_ship_movements = "//a[normalize-space(text())='Ship Movements']"
    
  • Next 7 days:结合文本和父容器
    xpath_days = "//div[contains(@class, 'date-range')]/a[normalize-space(text())='Next 7 days']"
    
  • Tools:通过文本或图标属性定位
    xpath_tools = "//a[normalize-space(text())='Tools']"
    
  • Export to Excel:等待Tools下拉菜单展开后,定位菜单内选项
    xpath_export = "//div[contains(@class, 'dropdown-menu')]/a[normalize-space(text())='Export to Excel']"
    

3. 完善等待逻辑

点击Tools后,下拉菜单需要时间渲染,需等待菜单可见后再点击导出选项:

# 点击Tools按钮
tools_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_tools)))
tools_button.click()

# 等待下拉菜单中的Export选项可见后点击
export_to_excel = wait.until(EC.visibility_of_element_located((By.XPATH, xpath_export)))
export_to_excel.click()

4. 处理元素遮挡问题

若按钮被弹窗、导航栏遮挡,使用ActionChains模拟鼠标移动后点击:

from selenium.webdriver.common.action_chains import ActionChains

# 定位元素后,模拟鼠标移动并点击
actions = ActionChains(driver)
actions.move_to_element(export_to_excel).click().perform()

修改后的完整示例代码

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 selenium.webdriver.common.action_chains import ActionChains
import time

# 优化后的XPath
xpath_ship_movements = "//a[normalize-space(text())='Ship Movements']"
xpath_days = "//div[contains(@class, 'date-range')]/a[normalize-space(text())='Next 7 days']"
xpath_tools = "//a[normalize-space(text())='Tools']"
xpath_export = "//div[contains(@class, 'dropdown-menu')]/a[normalize-space(text())='Export to Excel']"
url = "https://qships.tmr.qld.gov.au/webx/#"

driver = webdriver.Edge()
driver.get(url)
driver.maximize_window()
wait = WebDriverWait(driver, 20)

try:
    # 切换到iframe(需根据实际页面调整iframe的定位方式)
    # wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "webx-main-frame")))

    # 点击Ship Movements
    ship_movements_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_ship_movements)))
    ship_movements_button.click()

    # 点击Next 7 days
    next_7_days_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_days)))
    next_7_days_button.click()

    # 点击Tools并等待下拉菜单展开
    tools_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_tools)))
    tools_button.click()

    # 点击Export to Excel(若有遮挡则用ActionChains)
    export_to_excel = wait.until(EC.visibility_of_element_located((By.XPATH, xpath_export)))
    # actions = ActionChains(driver)
    # actions.move_to_element(export_to_excel).click().perform()
    export_to_excel.click()

    # 等待下载完成
    time.sleep(10)
finally:
    driver.quit()

额外排查建议

  • 打开浏览器开发者工具(F12),在Elements面板中搜索目标元素,确认XPath是否匹配;
  • 检查元素是否存在于嵌套iframe中,若存在需逐一切换;
  • 若页面有AJAX加载,可等待页面的加载状态图标消失后再操作。

内容的提问来源于stack exchange,提问作者Zeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:32:12