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

使用Selenium Python爬取CBP官网数据时点击搜索按钮报错的求助

使用Selenium Python爬取CBP官网数据时点击搜索按钮报错的求助

看起来你遇到的核心问题是搜索按钮的ID是动态生成的——每次页面加载,ID后面的随机后缀都会变化,所以你写死的固定ID肯定找不到元素,直接就触发报错了!另外代码里还缺了time和logging的导入语句,运行时也会出问题,我帮你梳理下修复方案:

问题根源拆解

  • 搜索按钮ID动态变化:你定义的SEARCH_ID是edit-submit-newsroom--5CcqMDJL-LM,但代码里又用了另一个edit-submit-newsroom--uZGWwDKmBW8,这说明这个ID每次访问都会随机生成,用ID定位完全不可靠。
  • 缺失必要模块:代码里用了time.sleep()和logging,但没导入这两个模块,运行时会先报导入错误。
  • 过度依赖硬等待:time.sleep()的等待时间是固定的,容易出现等待不足或等待过久的情况,用显式等待更稳定。

修复后的完整代码

import time
import logging
from selenium.webdriver import ChromeOptions
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化日志配置(可选,让日志输出更规范)
logging.basicConfig(level=logging.INFO)

URL = "https://www.cbp.gov/newsroom/media-releases/all?field_date_release_value%5Bmin%5D=&field_date_release_value%5Bmax%5D=&field_newsroom_type_target_id_1=54&body_value="
SELECT_XPATH = "/html/body/div[1]/main/div/div[2]/div/div/div[4]/article/div/div[4]/div/div/div/div/div[1]/form/div/div[2]/div[1]/div[2]/div/select"

driver = webdriver.Chrome()
fiscal_yr = '2023'
driver.get(URL)

wait = WebDriverWait(driver, 20)

# 等待下拉选框加载并选择目标财年
s = Select(wait.until(EC.presence_of_element_located((By.XPATH, SELECT_XPATH))))
fiscal_yr_str = str(fiscal_yr)
if fiscal_yr_str in {option.text for option in s.options}:
    print(fiscal_yr_str)
    logging.info("fiscal_year: {}".format(fiscal_yr_str))
    s.select_by_visible_text(fiscal_yr_str)

    # 用按钮文本定位搜索按钮(避开动态ID的坑)
    search_element = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Apply filters')]")))
    search_element.click()

    # 等待分页元素加载并获取文本
    page_xpath = "/html/body/div[1]/main/div/div[2]/div/div/div[4]/article/div/div[4]/div/div/div/div/div[2]"
    if driver.find_elements(By.XPATH, page_xpath):
        page_nums = wait.until(EC.presence_of_element_located((By.XPATH, page_xpath)))
        page1 = page_nums.text
        print(page1)

# 可选:关闭浏览器避免进程残留
# driver.quit()

关键修改点说明

  1. 补上了import time和import logging,并初始化了日志配置,解决模块缺失问题。
  2. 把搜索按钮的定位方式换成了按固定文本的XPath://button[contains(text(), 'Apply filters')],按钮文本是页面固定的,不会随加载变化,定位更可靠。
  3. 移除了不必要的time.sleep(),全部用WebDriverWait显式等待,既保证元素加载完成,又节省等待时间。
  4. 微调了变量命名,让代码逻辑更清晰。

如果还是遇到问题,可以检查页面是否有弹窗遮挡按钮,目前看该页面没有iframe或弹窗干扰,应该能正常运行~

备注:内容来源于stack exchange,提问作者emiley mille

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:14:35