如何使用pd.read_html抓取含百分比值的HTML表格并解决解析报错
解决方法
你遇到的报错是因为pd.read_html默认会自动推断页面表格列的数据类型,遇到带%的字符串时尝试转换为整数失败,你可以通过强制先将所有列读取为字符串规避类型推断报错,后续再自行处理百分比格式的数值即可。
你可以直接使用如下修改后的代码:
import requests import pandas as pd # 基金ID列表 fund_ids = ['LU0526609390:EUR', 'IE00BHBX0Z19:EUR', 'LU1076093779:EUR', 'LU1116896363:EUR'] result = [] for fund_id in fund_ids: url = f'https://markets.ft.com/data/funds/tearsheet/summary?s={fund_id}' r = requests.get(url).content # 强制所有列读取为字符串,避免类型推断报错 df_profile = pd.read_html(r, dtype=str)[0] # 将两列的键值对表格转置为一行,对应单个基金的所有属性 df_row = df_profile.set_index(0).T # 新增Fund_ID列关联对应基金 df_row.insert(0, 'Fund_ID', fund_id) result.append(df_row) # 合并所有基金数据 final_df = pd.concat(result, ignore_index=True) # (可选)处理百分比列,将%字符串转为数值 def parse_percent(val): if isinstance(val, str) and val.endswith('%'): return float(val.strip('%')) / 100 return val final_df = final_df.applymap(parse_percent) print(final_df)
代码说明
- 调用
pd.read_html时添加dtype=str参数,关闭自动类型推断,所有内容先以字符串格式读取,直接规避百分号转换报错 - 目标页面的「Profile and investment」为两列键值对格式,需要转置后才能得到每个基金占一行、属性为列的目标格式
- 可选的
parse_percent函数可以将百分比字符串转换为小数格式的数值,如果你需要保留原%字符串格式,删除这部分处理逻辑即可
内容的提问来源于stack exchange,提问作者Tcs106
相关产品推荐
相关产品推荐

