爬取247sports校队橄榄球历史招募数据时school与year字段重复问题求解
问题原因
你两次调用find_next("span", class_="meta")都会匹配到当前条目下第一个符合条件的span标签,所以两个字段取值完全相同。该网页的每个球员条目下存在两个class为meta的span标签,按DOM顺序第一个为高中学校信息,第二个为招募班级信息,按索引分别取值即可。
修复方案
核心修改逻辑
- 先获取当前球员条目下所有
meta类的span标签列表 - 按索引分别取第一个元素作为学校,第二个元素作为年份原始值
- 可选:用正则从年份原始值中提取纯数字年份,适配不同文本格式
修改后的代码片段
import requests from bs4 import BeautifulSoup import pandas as pd import re # 用于提取纯数字年份 Team = 'penn-state' url = f"https://247sports.com/college/{Team}/Sport/Football/AllTimeRecruits/" headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"} response = requests.get(url, headers = headers).content soup = BeautifulSoup(response, "html.parser") data = [] # 跳过表头行 for tag in soup.find_all("li", class_="ri-page__list-item")[1:]: rank = tag.find_next("span", class_="all-time-rank").text.strip() # 修复学校和年份字段取值逻辑 meta_list = tag.find_all("span", class_="meta") school = meta_list[0].text.strip() if len(meta_list)>=1 else "" year_raw = meta_list[1].text.strip() if len(meta_list)>=2 else "" # 提取4位数字年份,无匹配则保留原始文本 year = re.search(r'\d{4}', year_raw).group() if re.search(r'\d{4}', year_raw) else year_raw name = tag.find_next("a", class_="ri-page__name-link").text.strip() position = tag.find_next("div", class_="position").text.strip() height_weight = tag.find_next("div", class_="metrics").text.strip() rating = tag.find_next("span", class_="score").text.strip() nat_rank = tag.find_next("a", class_="natrank").text.strip() state_rank = tag.find_next("a", class_="sttrank").text.strip() pos_rank = tag.find_next("a", class_="posrank").text.strip() data.append( { "Rank": rank, "Name": name, "School": school, "Class of": year, "Position": position, "Height & Weight": height_weight, "Rating": rating, "National Rank": nat_rank, "State Rank": state_rank, "Position Rank": pos_rank, } ) df = pd.DataFrame(data) df
注意事项
- 增加了
strip()方法去除字段前后多余的空白字符 - 增加了列表长度判断,避免部分异常条目不存在对应字段时抛出索引错误
- 正则匹配4位数字的逻辑适配包含“Class of XXXX”等前缀的年份文本,若网页返回的年份本身就是纯数字,可以删除正则提取逻辑直接使用
year_raw
内容的提问来源于stack exchange,提问作者BLuta
相关产品推荐
相关产品推荐

