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

使用BeautifulSoup读取ASPX页面表格前,如何操作下拉列表?

解决ASPX页面下拉列表联动与表格爬取问题

问题根源

ASPX(WebForms)页面依赖ViewState、EventValidation等隐藏字段维护页面状态,下拉列表的联动(比如选择学位后刷新学院列表)是通过PostBack机制实现的。直接用requests.get只能获取初始静态页面,无法触发动态交互流程,自然拿不到目标表格数据。

解决步骤

  1. 获取初始页面的核心状态字段
    首次请求页面时,提取__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION这些隐藏字段,同时获取第一个下拉列表(d_deg)的可选值。

  2. 逐次模拟下拉选择的Post请求
    每选择一个下拉选项,就构造包含状态字段和选中值的Post数据提交,获取更新后的页面后,提取下一个下拉列表的选项,重复此流程直到选完所有目标下拉项。

  3. 解析目标表格内容
    完成所有下拉选择后,从最终返回的页面中提取GridView1表格的内容。

示例代码

import requests
from bs4 import BeautifulSoup

url = 'http://webapp.ttu.edu.jo/corse_study/Default.aspx'
session = requests.Session()  # 用会话维持请求状态

def extract_state_fields(soup_obj):
    """提取ASPX页面的状态维护字段"""
    return {
        '__VIEWSTATE': soup_obj.find('input', {'id': '__VIEWSTATE'})['value'],
        '__VIEWSTATEGENERATOR': soup_obj.find('input', {'id': '__VIEWSTATEGENERATOR'})['value'],
        '__EVENTVALIDATION': soup_obj.find('input', {'id': '__EVENTVALIDATION'})['value']
    }

# 1. 获取初始页面及状态字段
response = session.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
state_fields = extract_state_fields(soup)

# 2. 选择学位下拉列表d_deg(示例选第一个有效选项,可按需修改)
deg_options = soup.select('#d_deg option')
target_deg = deg_options[1]['value']  # 跳过默认空选项

post_data = state_fields.copy()
post_data['__EVENTTARGET'] = 'd_deg'
post_data['__EVENTARGUMENT'] = ''
post_data['d_deg'] = target_deg

response = session.post(url, data=post_data)
soup = BeautifulSoup(response.text, 'html.parser')
state_fields = extract_state_fields(soup)

# 3. 选择学院下拉列表d_coll
coll_options = soup.select('#d_coll option')
target_coll = coll_options[1]['value']

post_data = state_fields.copy()
post_data['__EVENTTARGET'] = 'd_coll'
post_data['__EVENTARGUMENT'] = ''
post_data['d_coll'] = target_coll

response = session.post(url, data=post_data)
soup = BeautifulSoup(response.text, 'html.parser')
state_fields = extract_state_fields(soup)

# 4. 选择系部下拉列表d_dept
dept_options = soup.select('#d_dept option')
target_dept = dept_options[1]['value']

post_data = state_fields.copy()
post_data['__EVENTTARGET'] = 'd_dept'
post_data['__EVENTARGUMENT'] = ''
post_data['d_dept'] = target_dept

response = session.post(url, data=post_data)
soup = BeautifulSoup(response.text, 'html.parser')

# 5. 提取并输出目标表格内容
target_table = soup.select_one('#GridView1')
if target_table:
    for row in target_table.select('tr'):
        cells = row.select('td')
        if cells:
            print([cell.get_text(strip=True) for cell in cells])
else:
    print("未找到目标表格")

注意事项

  • 下拉选项的取值要根据实际需求调整,不要固定选第一个有效选项。
  • 如果页面有其他隐藏提交参数,需要从源码中补充到Post数据里。
  • 可添加User-Agent请求头模拟浏览器,避免被页面拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:55:22