You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Transfermarkt时字符串转float触发ValueError报错

报错原因
  • 身价单元格存在无数据场景:部分未评估身价的球员对应单元格文本为-,经过正则替换后会得到空字符串,空值无法转换为float类型
  • 正则规则存在冗余匹配项:正则中保留了空格字符,部分替换后的字符串首尾残留空格、换行符等不可见内容,同样会触发类型转换失败
    *额外提醒:你当前的逻辑还有两个隐藏bug:一是处理身价时直接删除了m(百万)、k(千)单位,即便不报错,转换出的数值也存在量级错误,和真实身价差1000到1000000倍;二是靠字符串长度筛选年龄的逻辑鲁棒性极差,且你提取到的内容是带出生日期的完整字符串,并非单独的年龄数值,页面类名复用、结构微调都会取到脏数据。
修复方案

核心修复思路:

  • 放弃全局零散查找标签的逻辑,直接定位球员表格的行节点逐行提取字段,避免混入其他无关单元格内容
  • 身价处理前先判断是否为空值标记-,无数据直接赋值为空,跳过转换
  • 调整正则规则,移除对空格的保留,同时匹配数值和对应单位,统一换算为实际欧元数值,解决量级错误问题
  • 所有提取的文本先做strip()处理,清除首尾隐形空白字符,年龄单独从出生日期字符串中用正则提取,避免无效内容

修正后的核心代码:

import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

headers = {'User-Agent': 
           'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}

page = "https://www.transfermarkt.com/esperance-tunis/startseite/verein/3342"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')

# 直接定位球员表的所有数据行,跳过表头和空行
player_rows = pageSoup.select("table.items > tbody > tr")
Name = []
Ages = []
Value = []

for row in player_rows:
    # 跳过无球员信息的分隔空行
    name_tag = row.select_one("div.di.nowrap")
    if not name_tag:
        continue
    # 提取球员姓名,清除首尾空白
    Name.append(name_tag.text.strip())
    
    # 提取并处理年龄:从出生日期字符串中提取括号内的年龄数字
    age_td = row.select("td.zentriert")[1]
    age_text = age_td.text.strip()
    age_match = re.search(r"\((\d{1,2})\)", age_text)
    Ages.append(int(age_match.group(1)) if age_match else None)
    
    # 提取并处理身价
    value_tag = row.select_one("td.rechts.hauptlink")
    value_text = value_tag.text.strip()
    # 处理无身价数据的情况
    if value_text == "-":
        Value.append(None)
        continue
    # 匹配数值和单位,统一换算为欧元
    value_match = re.match(r"€([\d\.]+)(m|k)", value_text)
    if not value_match:
        Value.append(None)
        continue
    num = float(value_match.group(1))
    unit = value_match.group(2)
    if unit == "m":
        total_value = num * 1000000
    elif unit == "k":
        total_value = num * 1000
    else:
        total_value = None
    Value.append(total_value)

# 直接转为DataFrame使用即可
df = pd.DataFrame({"球员姓名":Name, "年龄":Ages, "身价(欧元)":Value})

内容的提问来源于stack exchange,提问作者Anas Souabni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:09:26