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

如何用Python爬取与主页面URL相同的表单提交后页面?

解决URL不变的财年页面爬取问题

这个网站通过POST表单提交加载对应财年的数据,URL不会变化,所以要通过等待页面内容更新来定位爬取目标,同时优化你的代码逻辑:

问题分析

你的代码存在几个可优化的点:

  • 依赖固定索引的XPath定位下拉选项,页面结构变化时会直接失效
  • 重复查找元素属于冗余操作,易引发错误
  • 点击搜索后未等待结果加载完成,直接获取URL无实际意义

优化后的实现代码

from selenium import webdriver
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

# 初始化浏览器
driver = webdriver.Chrome()
url = "https://cfpub.epa.gov/compliance/criminal_prosecution/index.cfm"
driver.get(url)

# 1. 定位财年下拉框,用Select类处理更稳定
# 先等待下拉框加载完成
year_select = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//*[@id=\"main-content\"]/div[2]/div[1]/div/div/form/table/tbody/tr[8]/td/div/div[2]/select"))
)
# 转换为Select对象
select = Select(year_select)
# 通过可见文本选择2023财年(也可以用select.select_by_value("对应value值"))
select.select_by_visible_text("FY 2023")

# 2. 点击搜索按钮
search_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "searchButton"))
)
search_btn.click()

# 3. 等待结果区域加载完成(这里假设结果表格是目标,可根据实际页面调整定位)
result_table = WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.XPATH, "//*[@id=\"main-content\"]/div[2]/div[2]/div/div/table"))
)

# 4. 爬取数据,示例:提取表格所有行内容
rows = result_table.find_elements(By.TAG_NAME, "tr")
for row in rows:
    cols = row.find_elements(By.TAG_NAME, "td")
    row_text = [col.text.strip() for col in cols]
    print(row_text)

# 关闭浏览器
driver.quit()

核心要点

  • 用Select类处理下拉选择框,避免依赖固定索引的XPath,大幅提升代码稳定性
  • 点击搜索后,必须等待结果元素加载完成(而非等待URL变化),因为页面是通过局部更新加载数据
  • 爬取时直接定位加载后的结果区域元素,提取所需数据即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:45:06