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

pd.read_html解析BeautifulSoup提取的维基百科信息框时浮点数丢失

解决维基百科选举信息框Percentage列NaN问题

核心原因

维基百科的选举结果信息框里,百分比数值和%符号通常放在嵌套子标签里(比如<span>装数字、<sup>装%),而pd.read_html默认只会读取单元格的直接文本内容,不会自动合并子标签里的文本,导致提取时拿不到完整的百分比数据,出现NaN。

解决步骤

  1. 精准定位目标表格:不要把整个页面的soup传给read_html,先找到选举结果对应的信息框表格(避免解析其他无关表格)。
  2. 合并单元格内的嵌套文本:遍历表格的所有单元格,把每个单元格下所有子标签的文本提取并合并,覆盖原单元格内容。
  3. 再转换为DataFrame:处理后的表格再用pd.read_html解析,就能正确识别百分比列。

完整代码示例

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 获取页面内容
url = "https://en.wikipedia.org/wiki/2020_United_States_presidential_election_in_Alabama"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 定位选举结果信息框表格(维基百科此类表格通常带infobox vevent类)
election_table = soup.find('table', class_='infobox vevent')

# 遍历所有单元格,合并嵌套文本
for row in election_table.find_all('tr'):
    for cell in row.find_all(['td', 'th']):
        # 提取当前单元格下所有层级的文本,去重空格后合并
        full_content = ''.join(cell.stripped_strings)
        # 清空原单元格内容,写入合并后的文本
        cell.clear()
        cell.append(full_content)

# 转换为DataFrame并查看结果
dfs = pd.read_html(str(election_table))
result_df = dfs[0]
print(result_df['Percentage'])

额外排查点

如果还是出现NaN,检查以下情况:

  • 确认目标表格的class是否正确:有些维基百科页面的选举表格class可能是infobox election results,可以通过浏览器开发者工具查看。
  • 检查表格的表头是否正确:如果表头是合并单元格生成的,pd.read_html可能会解析出异常列名,此时可以手动指定表头(比如header=1)。

内容的提问来源于stack exchange,提问作者Gleb Ryabov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:30:12