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

如何通过遍历BeautifulSoup获取网站所有表单的action链接?

获取网站所有表单的Action链接解决方案

我看你当前的代码只抓取了第一个表单的action属性,这是因为find('form')只会返回页面中第一个匹配的<form>元素。要获取所有表单的action,只需要把查找方式改成find_all('form'),然后遍历所有表单即可。

修正后的完整代码

import requests
from bs4 import BeautifulSoup

with requests.Session() as c:
    url = 'https://website.com/login'
    EMAIL = '你的邮箱'
    PASSWORD = '你的密码'
    
    # 先访问登录页面,确保获取必要的会话信息(比如CSRF令牌)
    c.get(url)
    
    # 构造登录数据(如果网站有CSRF验证,需要从登录表单中提取令牌并添加到这里)
    login_data = dict(email=EMAIL, password=PASSWORD)
    # 提交登录请求
    c.post(url, data=login_data, headers={"Referer": "https://website.com/"})
    
    # 登录后访问目标页面
    page = c.get('https://website.com/dashboard')
    parser = BeautifulSoup(page.content, 'html.parser')
    
    # 获取页面中所有表单元素
    all_forms = parser.find_all('form')
    
    # 遍历每个表单,提取并处理action属性
    for index, form in enumerate(all_forms, 1):
        # 安全获取action属性(避免无action时抛出异常)
        action_path = form.get('action')
        
        if action_path:
            # 把相对路径转换为完整URL(处理action是'/xxx'这类相对路径的情况)
            full_action_url = requests.compat.urljoin(url, action_path)
            print(f"表单{index}的完整action链接:{full_action_url}")
        else:
            print(f"表单{index}未设置action属性")

关键细节说明

  • find_all('form'):这个方法会返回页面中所有的<form>标签组成的列表,而不是单个元素,这样就能遍历处理每一个表单。
  • form.get('action'):使用get()方法获取属性比直接用form['action']更安全——如果某个表单没有设置action属性,get()会返回None,而直接取值会抛出KeyError异常。
  • 处理相对路径:很多网站的表单action用的是相对路径(比如/submit-form),用requests.compat.urljoin可以自动拼接成完整的绝对URL,避免拿到无效的链接。
  • 额外提示:如果登录失败,大概率是因为网站有CSRF验证。这时候需要先解析登录页面的表单,提取CSRF令牌(通常是name为csrf_token或_token的输入框),然后把这个令牌添加到login_data中再提交。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:34