讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在网页爬虫中正确提取超链接避免 NaN 值

夜雪君_3771

夜雪君_3771

发布时间:2026-02-20 20:59:00

|

1084人浏览过

|

来源于php中文网

原创

如何在网页爬虫中正确提取超链接避免 NaN 值

本文详解使用 BeautifulSoup 从表格中精准提取嵌套在 内的 链接时常见错误(如误读 href 属性、未清洗文本、变量未定义),并提供可直接运行的修复方案,确保 Player_URL 列不再返回 NaN。

本文详解使用 beautifulsoup 从表格中精准提取嵌套在 `` 内的 `` 链接时常见错误(如误读 `href` 属性、未清洗文本、变量未定义),并提供可直接运行的修复方案,确保 player_url 列不再返回 nan。

在使用 requests + BeautifulSoup 进行网页数据抓取时,一个高频陷阱是:试图从非链接标签(如 )上直接获取 href 属性。这会导致 link.get("href") 返回 None,当赋值给 pandas DataFrame 的某列时,pandas 自动将其转换为 NaN——而这正是原代码中 Player_URL 列全为 NaN 的根本原因。

更关键的是,原始逻辑存在三处结构性缺陷:

  1. HTML 结构误判:目标链接实际位于 Player Name 中,href 属于 标签,而非外层 ;
  2. 名称匹配前未标准化:DataFrame 中的 Player 字段含括号、空格、换行符(如 "Nikita Kucherov (RW)"),而 文本为 "Nikita Kucherov",直接 df.Player == name 匹配必然失败;
  3. 变量作用域错误:循环中使用了未定义的 name 变量,且 list = link.get("href") 覆盖了列表而非追加。

✅ 正确做法是:先提取 标签 → 获取其 href 和 .text → 清洗玩家姓名(移除括号及括号内位置信息)→ 在清洗后的 Player 列中进行模糊匹配或精确对齐。

智能网页爬虫
智能网页爬虫

智能网页数据采集器,自动识别页面结构,批量抓取列表/表格/详情页数据,支持导出JSON/CSV/Excel,内置反爬策略适配。

下载

以下是修复后的完整可运行代码(已适配 pandas 2.0+,兼容 applymap 已弃用问题):

import requests
from bs4 import BeautifulSoup
import pandas as pd

start_url = 'https://www.eliteprospects.com/league/nhl/stats/2023-2024'
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")

# 提取表头(注意:部分 th 可能含换行,需 strip)
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:
    tds = row.find_all("td")
    if not tds: continue
    # 清洗每单元格文本:去换行、首尾空格
    row_data = [td.get_text(strip=True) for td in tds]
    if len(row_data) == len(headers):
        df.loc[len(df)] = row_data

# ✅ 关键修复:提取 Player_URL
df["Player_URL"] = None  # 初始化列,避免 SettingWithCopyWarning

# 遍历所有 <span class="txt-blue">,定位其内部 <a>
for span in table.find_all("span", class_="txt-blue"):
    a_tag = span.find("a")
    if not a_tag or not a_tag.get("href") or not a_tag.get_text(strip=True):
        continue
    full_url = a_tag["href"]
    raw_name = a_tag.get_text(strip=True)

    # 清洗姓名:移除 "(POS)" 类后缀(如 "(RW)"、"(C/LW)"),仅保留主名
    clean_name = raw_name.split("(")[0].strip()

    # 在 df.Player 列中查找匹配项(建议使用 str.contains 增强鲁棒性)
    mask = df["Player"].str.contains(f"^{clean_name}($|\s*\()", na=False, regex=True)
    if mask.any():
        df.loc[mask, "Player_URL"] = "https://www.eliteprospects.com" + full_url

# 后处理:统一清洗全表字符串字段
str_cols = df.select_dtypes(include=["object"]).columns
df[str_cols] = df[str_cols].apply(lambda x: x.str.strip() if x.dtype == "object" else x)

# 输出验证
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 120)
print(df[["Player", "Team", "GP", "G", "A", "TP", "Player_URL"]].head())

? 注意事项与进阶建议:

  • 反爬策略:该网站无强反爬,但长期批量请求建议添加 headers={'User-Agent': 'Mozilla/5.0https://www.php.cn/link/263b1243ca2dbeb358777ceabc4a2e4c'} 及合理 time.sleep();
  • 动态内容风险:若未来页面改用 JavaScript 渲染表格(如 React/Vue),requests 将失效,需切换至 Selenium 或 Playwright;
  • 健壮性增强:生产环境应封装为函数,加入异常捕获(try/except)、重试机制及日志记录;
  • 多赛季扩展:按年份循环构造 URL(如 f"https://www.eliteprospects.com/league/nhl/stats/{year}-{year+1}"),合并各年 DataFrame 即可实现目标。

通过理解 HTML 嵌套结构、严格区分标签职责、预处理文本一致性,即可彻底规避 NaN 链接问题——这不仅是技术修复,更是 Web Scraping 工程化思维的关键一课。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

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

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

693

2023.11.13

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

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

340

2025.12.04

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

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

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

831

2026.04.13

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

4436

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

326

2025.12.06

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5530

2024.08.16

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn