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

如何用Beautiful Soup获取选择联赛后select标签中的球队元素?

问题

我想要爬取网站https://fbref.com/en/,该网站需先选择联赛再选择球队。我希望选定联赛后,爬取对应的球队选项,请问如何实现?我的代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from bs4 import BeautifulSoup
import requests

result=requests.get('https://fbref.com/en/')
soup=BeautifulSoup(result.text, 'html.parser')

leagues=[]
teams=[]

for option in soup.find('select', id='league_choice'):
      leagues.append(option.text)

for option in soup.find('select', id='team_choice'):
    teams.append(option.text)

我知道Selenium可以实现,但想了解是否能用Beautiful Soup完成该操作。

解决方案

直接爬取首页HTML拿不到对应联赛的球队选项,因为team_choice下拉框的内容是动态加载的——只有选完联赛后,网站才会通过AJAX请求拉取对应球队数据并填充,首页静态HTML里的team_choice只有空选项或默认值。

不过不用Selenium也能实现,用requests模拟网站加载球队的AJAX请求就行,步骤如下:

  1. 先从首页的league_choice下拉框里获取每个联赛对应的value属性值(不是文本),这是请求球队数据的关键参数。
  2. 找到加载球队的接口:通过浏览器开发者工具观察,选联赛时会发送GET请求到https://fbref.com/en/inc/options/teams.cgi,携带lg参数(即联赛的value值)。
  3. 用requests发送该请求,拿到返回的HTML片段后,用BeautifulSoup解析出球队选项。

修改后的代码示例:

import requests
from bs4 import BeautifulSoup

# 1. 获取联赛列表及对应的value参数
base_url = "https://fbref.com/en/"
result = requests.get(base_url)
soup = BeautifulSoup(result.text, 'html.parser')

league_select = soup.find('select', id='league_choice')
league_options = []
for option in league_select.find_all('option'):
    league_value = option.get('value')
    if league_value:  # 跳过无意义的默认选项
        league_options.append({
            'name': option.text.strip(),
            'value': league_value
        })

# 示例:选取第一个联赛(可替换为你需要的联赛value)
target_league = league_options[0]
print(f"正在获取{target_league['name']}的球队列表...")

# 2. 请求对应联赛的球队数据
teams_api_url = "https://fbref.com/en/inc/options/teams.cgi"
request_params = {'lg': target_league['value']}
teams_response = requests.get(teams_api_url, params=request_params)
teams_soup = BeautifulSoup(teams_response.text, 'html.parser')

# 3. 解析并提取球队信息
teams_list = []
for option in teams_soup.find_all('option'):
    team_value = option.get('value')
    if team_value:
        teams_list.append({
            'team_name': option.text.strip(),
            'team_value': team_value
        })

# 输出前5个球队示例
for team in teams_list[:5]:
    print(f"球队:{team['team_name']} | 对应参数:{team['team_value']}")

说明:

  • 这种方法比Selenium更高效,不需要加载整个页面,只请求必要的数据。
  • 如果需要切换其他联赛,只需要修改target_league对应的value值即可。

内容的提问来源于stack exchange,提问作者Ahmed Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16