如何用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
相关产品推荐
相关产品推荐

