You need to enable JavaScript to run this app. 爬取247sports校队橄榄球历史招募数据时school与year字段重复问题求解
优惠活动
大模型
产品
解决方案
定价
更多

爬取247sports校队橄榄球历史招募数据时school与year字段重复问题求解

问题原因

你两次调用find_next("span", class_="meta")都会匹配到当前条目下第一个符合条件的span标签,所以两个字段取值完全相同。该网页的每个球员条目下存在两个class为meta的span标签,按DOM顺序第一个为高中学校信息,第二个为招募班级信息,按索引分别取值即可。

修复方案

核心修改逻辑

  1. 先获取当前球员条目下所有meta类的span标签列表
  2. 按索引分别取第一个元素作为学校,第二个元素作为年份原始值
  3. 可选:用正则从年份原始值中提取纯数字年份,适配不同文本格式

修改后的代码片段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 07:36:04