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
相关产品推荐
相关产品推荐

