如何用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请求就行,步骤如下:
- 先从首页的
league_choice下拉框里获取每个联赛对应的value属性值(不是文本),这是请求球队数据的关键参数。 - 找到加载球队的接口:通过浏览器开发者工具观察,选联赛时会发送GET请求到
https://fbref.com/en/inc/options/teams.cgi,携带lg参数(即联赛的value值)。 - 用
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
相关产品推荐
相关产品推荐

