使用BeautifulSoup和Flask筛选NFL伤病数据指定列并格式化显示
解决方案
1. 精准筛选表格元素,提取目标字段
用BeautifulSoup定位伤病表格的行与列,跳过表头后直接提取队名、球员名、位置、伤病这四个核心字段,再拼接成你需要的格式。示例代码如下:
from flask import Flask, render_template_string import requests from bs4 import BeautifulSoup app = Flask(__name__) @app.route('/') def show_injuries(): # 目标页面地址 url = "https://www.cbssports.com/nfl/injuries/" # 模拟浏览器请求,避免反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 定位伤病表格的所有数据行(跳过表头行) injury_rows = soup.select('table.TableBase-table tr')[1:] n = 10 # 自定义展示最近n条数据 recent_injuries = [] for row in injury_rows[:n]: tds = row.find_all('td') # 确保当前行有足够列数,避免索引越界 if len(tds) >= 4: # 根据页面实际列顺序提取字段,若页面更新需调整索引 team = tds[0].get_text(strip=True) player = tds[1].get_text(strip=True) position = tds[2].get_text(strip=True) injury = tds[3].get_text(strip=True) # 拼接成指定格式 formatted_line = f"{team} {player} {position} {injury}" recent_injuries.append(formatted_line) # 用简单的HTML列表展示结果,避免DataFrame转HTML的格式冲突 return render_template_string(''' <h2>最近NFL伤病数据</h2> <ul> {% for line in injuries %} <li>{{ line }}</li> {% endfor %} </ul> ''', injuries=recent_injuries) if __name__ == '__main__': app.run(debug=True)
2. 关键注意事项
- 列索引调整:如果提取的字段不对,打开CBS伤病页检查元素,打印每行所有
td的文本内容,确认队名、球员等字段对应的索引位置:for td in tds: print(td.get_text(strip=True)) - 替代DataFrame方案:之前用DataFrame展示出错,是因为默认的
to_html()生成的表格样式容易和Flask模板冲突,直接提取字段拼接成纯文本格式更稳定。 - 反爬应对:如果请求被拦截,补充
Referer等请求头字段,或添加请求间隔(time.sleep(1))。
内容的提问来源于stack exchange,提问作者J. Rumpelstiltskin
相关产品推荐
相关产品推荐

