使用BeautifulSoup解析FBref页面时无法获取第二个目标表格的问题
解决方法:获取页面第二个表格的正确姿势
你的问题出在对BeautifulSoup的find()方法理解有误,咱们一步步拆解问题并修复:
为什么你的代码没返回内容?
find()方法只会返回第一个匹配到的元素,它返回的是单个Tag对象,不是列表。你后面加的[1]并不是在取第二个表格,而是试图获取这个第一个表格下的第2个子元素(按标签顺序),这显然不是你想要的,所以自然返回空内容。
另外,类名里重复的min_width虽然不影响匹配,但用CSS选择器来匹配多类元素会更稳定。
修正后的代码方案
方案1:用find_all()获取所有匹配表格
find_all()会返回所有符合条件的元素列表,之后你就可以通过索引[1]拿到第二个表格:
from bs4 import BeautifulSoup import requests # 可选:添加请求头避免反爬(如果之后遇到403错误) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} source = requests.get('https://fbref.com/en/comps/9/gca/Premier-League-Stats', headers=headers).text soup = BeautifulSoup(source, 'lxml') # 获取所有符合类名的表格 stattables = soup.find_all('table', class_='min_width sortable stats_table min_width shade_zero') # 检查是否存在第二个表格,再输出 if len(stattables) >= 2: stattable = stattables[1] print(stattable) else: print("未找到第二个目标表格")
方案2:用CSS选择器(更推荐)
CSS选择器对多类元素的匹配逻辑更清晰,避免类名顺序或重复带来的潜在问题:
from bs4 import BeautifulSoup import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} source = requests.get('https://fbref.com/en/comps/9/gca/Premier-League-Stats', headers=headers).text soup = BeautifulSoup(source, 'lxml') # 用CSS选择器匹配同时拥有这些类的表格 stattables = soup.select('table.min_width.sortable.stats_table.shade_zero') if len(stattables) >= 2: stattable = stattables[1] print(stattable) else: print("未找到第二个目标表格")
额外提示
- 加请求头是为了模拟浏览器请求,避免网站的反爬机制拦截你的请求(当前你可能没遇到,但加上更稳妥)。
- 如果之后需要提取表格里的具体数据,可以进一步遍历
stattable里的<tr>和<td>标签来获取内容。
内容的提问来源于stack exchange,提问作者Sushant Jha
相关产品推荐
相关产品推荐

