0

0

解决网络爬虫中 Player_URL 字段出现 NaN 值的问题

霞舞

霞舞

发布时间:2026-02-20 21:12:01

|

949人浏览过

|

来源于php中文网

原创

解决网络爬虫中 Player_URL 字段出现 NaN 值的问题

本文详解为何在使用 BeautifulSoup 解析 EliteProspects 球员统计表格时 Player_URL 列持续返回 NaN,并提供可直接运行的修复方案,涵盖 HTML 结构误判、属性访问错误、数据清洗时机等关键陷阱。

本文详解为何在使用 beautifulsoup 解析 eliteprospects 球员统计表格时 `player_url` 列持续返回 nan,并提供可直接运行的修复方案,涵盖 html 结构误判、属性访问错误、数据清洗时机等关键陷阱。

在网页爬虫实践中,NaN(Not a Number)值的出现往往并非数据本身缺失,而是解析逻辑与页面实际 DOM 结构不匹配所致。以从 EliteProspects NHL 2023–2024 统计页 提取球员个人主页链接为例,初学者常陷入三个典型误区:错误定位目标元素、混淆父/子标签属性、忽略数据标准化前置条件

? 根本原因分析

原始代码中以下三处关键问题直接导致 Player_URL 全为 NaN:

  1. 误读 HTML 层级结构
    代码试图从 标签直接获取 href 属性:

    link = span.get("href")  # ❌ 错误:span 本身无 href

    实际 HTML 结构为:

    <span class="txt-blue">
      <a href="/player/77237/nikita-kucherov">Nikita Kucherov (RW)</a>
    </span>

    href 属性属于 标签,而非其父

    文希AI写作
    文希AI写作

    AI论文写作平台

    下载
  2. 未声明变量 name 导致运行时错误
    df.Player == name 中的 name 未定义,触发 KeyError 或隐式布尔索引失败,pandas 回退填充 NaN。

  3. 数据清洗顺序错误
    df.replace() 和 applymap() 在 URL 注入前执行,但此时 Player 列仍含换行符与空格(如 "Nikita Kucherov (RW)\n"),导致后续 df.Player == name 字符串匹配失败(name 已被 .text 清洗为 "Nikita Kucherov (RW)")。

✅ 正确实现方案

以下是修复后的完整流程(已适配当前页面结构):

import requests
from bs4 import BeautifulSoup
import pandas as pd

start_url = 'https://www.php.cn/link/8641afa4db7421c9eeaf01260d8afefe'
r = requests.get(start_url)
r.raise_for_status()  # 显式检查 HTTP 错误

soup = BeautifulSoup(r.content, "html.parser")
table = soup.find("table", class_="table table-striped table-sortable player-stats highlight-stats season")

# 1. 构建初始 DataFrame(保留原始未清洗数据)
headers = [th.get_text(strip=True) for th in table.find_all("th")]
df = pd.DataFrame(columns=headers)

rows = table.find_all("tr")[1:]  # 跳过表头行
for row in rows:
    cells = row.find_all(["td", "th"])
    data = [cell.get_text(strip=True) for cell in cells]
    if len(data) == len(headers):
        df.loc[len(df)] = data

# 2. 【关键】先添加 Player_URL 列,再清洗数据
df["Player_URL"] = None  # 初始化为空

# 3. 遍历 span.txt-blue → 定位内部 <a> → 提取 href 和 text
for span in table.find_all("span", class_="txt-blue"):
    a_tag = span.find("a")
    if a_tag and a_tag.has_attr("href"):
        full_url = "https://www.eliteprospects.com" + a_tag["href"]  # 补全相对路径
        player_name = a_tag.get_text(strip=True)
        # 使用 .loc 进行精确赋值(注意:需确保 player_name 在 Player 列中完全一致)
        mask = df["Player"] == player_name
        if mask.any():
            df.loc[mask, "Player_URL"] = full_url

# 4. 【最后】统一清洗所有文本列(避免影响匹配)
text_columns = df.select_dtypes(include=["object"]).columns
df[text_columns] = df[text_columns].apply(lambda x: x.str.strip() if x.dtype == "object" else x)

# 查看结果
print(df[["Player", "Team", "GP", "Player_URL"]].head())

⚠️ 注意事项与最佳实践

  • 路径补全 返回的是相对路径(如 /player/77237/...),需手动拼接为绝对 URL。
  • 容错处理:添加 if a_tag and a_tag.has_attr("href") 防止空链接崩溃。
  • 匹配鲁棒性:若球员名存在格式差异(如括号位置、空格数),建议对 Player 列和 player_name 同步标准化(例如移除所有括号及括号内内容):
    import re
    df["Player_Clean"] = df["Player"].str.replace(r'\s*\(.*?\)', '', regex=True).str.strip()
    # 同步清洗 player_name...
  • 反爬提示:该站点无强反爬,但建议添加 headers={'User-Agent': 'Mozilla/5.0...'} 并控制请求频率。

? 总结

NaN 是爬虫调试中最常见的“沉默错误”,它往往掩盖了 DOM 结构理解偏差或数据流时序错误。本文案例表明:精准定位目标节点、严格遵循父子属性归属、合理安排数据清洗阶段,是规避 NaN 的三大支柱。当遇到类似问题时,优先用 print(span.prettify()) 检查实际 HTML,再比对代码逻辑——这比盲目修改选择器更高效可靠。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

75

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

7

2026.01.31

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

13

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

824

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

594

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.3万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 835人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号