Pandas 的 read_html 在解析含逗号小数分隔符(如 0,62)的网页表格时,默认将其误识别为千位分隔符,导致小数丢失、数据错乱;通过显式指定 decimal=',' 和 thousands=None 可精准控制数值解析逻辑。
python 中使用 pandas 的 `read_html` 解析网页表格时,若源数据采用欧洲格式的小数分隔符(如 `0,62`),默认会将逗号识别为千位分隔符,从而错误地转换为 `062` 等无效整数——这并非 bug,而是解析器对本地化数字格式缺乏自动推断所致。正确做法是主动配置 `decimal` 和 `thousands` 参数。
pandas.read_html() 默认按美式数字格式(. 为小数点,, 为千位符)解析数值。当目标网页使用意大利语或其它欧洲语言环境(如 fbref.com/it 页面)时,数字普遍写作 12.345,67(即 , 表示小数点,. 表示千位分隔),此时必须显式声明:
df = pd.read_html(
html_source,
attrs={'id': 'stats_shooting'},
header=1, # 跳过第一行表头(适配多级列结构)
thousands=None, # 禁用千位分隔符识别,避免逗号被误删
decimal=',' # 明确指定逗号为小数分隔符
)[0]
⚠️ 注意:fbref.com 的 HTML 源码中目标表格常被注释包裹(),直接传入原始 HTML 会导致 read_html 找不到元素。推荐预处理去除注释:
import requests response = requests.get('https://fbref.com/it/comp/11/shooting/Statistiche-di-Serie-A') clean_html = response.text.replace('<!--', '').replace('-->', '') df = pd.read_html(clean_html, attrs={'id': 'stats_shooting'}, header=1, thousands=None, decimal=',')[0]
此外,该页面的表格含重复的子标题行(如 'Pos.' 出现多次),可快速清洗:
df = df[df['Pos.'] != 'Pos.'].reset_index(drop=True) # 过滤掉非数据行
最终,你将获得正确解析的浮点数值列(如 0,62 → 0.62),无需后续字符串替换或正则修复,大幅提升数据可信度与分析效率。建议始终在 read_html 中显式设置 decimal 和 thousands,尤其在处理多语言网页时——这是稳健 Web 数据采集的关键实践。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











