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

Selenium Python自动化爬取IMF数据:国家选择功能故障排查

IMF数据网站Selenium自动化问题解决

问题背景

使用Selenium Python工具包从IMF数据网站自动化选择并下载数据时,已成功打开左侧「Counterpart Country」按钮对应的对话框并输入目标国家名称,但无法完成点击搜索按钮、选择国家并应用更改的操作。相关代码如下:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os
import glob
import shutil
import time
import chromedriver_binary
#from webdriver_manager.chrome import ChromeDriverManager
import warnings
warnings.filterwarnings("ignore")

pagina='https://data.imf.org/?sk=9d6028d4-f14a-464c-a2f2-59b2cd424b85&sid=1390030341854'

path='C:\\Program Files (x86)\\chromedriver.exe'
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"

driver = webdriver.Chrome(desired_capabilities=capa,executable_path=path)
wait = WebDriverWait(driver, 15)
driver.get(pagina)
time.sleep(10)
wait.until(EC.presence_of_element_located((By.ID, 'RoundButton27215')))
country = driver.find_element_by_xpath("//*[@id='RoundButton27215']")
driver.execute_script("arguments[0].click();", country)
textbox = driver.find_element_by_xpath("//*[@id='TextBox42785']/table/tbody/tr/td[2]/input")
textbox.clear()
textbox.send_keys('Italy')
textbutton = driver.find_element_by_xpath('//*[@id="TextBox42785"]/table/tbody/tr/td[3]')
driver.execute_script("arguments[0].click();", textbutton)

常见问题及修正方案

1. 元素定位不稳定

IMF网站部分元素ID为动态生成,刷新页面后可能变化,建议改用元素文本、属性特征等更稳定的定位方式,避免依赖动态ID。

2. 未等待元素可交互

原代码仅等待元素存在,但元素可能仍处于不可点击状态。需改用EC.element_to_be_clickable等待条件,替代硬编码的time.sleep,提升脚本稳定性。

3. 缺失搜索后选择及应用步骤

输入国家名搜索后,需等待结果加载、选中目标国家,再点击应用按钮完成筛选,原代码缺少这部分逻辑。

修正后的代码示例

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import warnings
warnings.filterwarnings("ignore")

pagina='https://data.imf.org/?sk=9d6028d4-f14a-464c-a2f2-59b2cd424b85&sid=1390030341854'

path='C:\\Program Files (x86)\\chromedriver.exe'
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "eager"  # 改用eager加载策略,更可控

driver = webdriver.Chrome(desired_capabilities=capa, executable_path=path)
wait = WebDriverWait(driver, 20)

try:
    driver.get(pagina)
    # 等待Counterpart Country按钮可点击并点击
    country_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Counterpart Country')]")))
    country_btn.click()
    
    # 等待搜索输入框可交互并输入国家名
    search_box = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@id='TextBox42785']//input[@type='text']")))
    search_box.clear()
    search_box.send_keys('Italy')
    
    # 等待搜索按钮可点击并触发搜索
    search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@id='TextBox42785']//input[@value='Search']")))
    search_btn.click()
    
    # 等待搜索结果加载并选中Italy
    italy_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//td[contains(text(), 'Italy')]")))
    italy_option.click()
    
    # 点击应用按钮完成筛选
    apply_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Apply Changes']")))
    apply_btn.click()
    
finally:
    # 按需决定是否关闭浏览器,留空可保留页面用于后续操作
    # driver.quit()
    pass

额外提示

  • 若页面存在iframe嵌套,需先通过driver.switch_to.frame()切换到对应iframe,才能操作内部元素。
  • 若仍出现定位失败,可通过浏览器开发者工具查看元素的class、aria-label等属性,构建更精准的定位表达式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:47:10