如何通过遍历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
相关产品推荐
相关产品推荐

