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

如何用Pandas正确解析HTML为Unicode字符串并处理CSV空值问题

解决pandas提取HTML表格写入CSV时的空字符串与编码问题

你的问题主要出在把DataFrame直接转成字符串再拆分的处理方式上,这种操作会引入大量格式性空格,split后自然产生一堆空字符串;另外手动的encode/decode操作完全没必要,反而可能引发编码混乱。下面给你两种可行的解决方案:

方案一:用pandas原生to_csv(最简便可靠)

pandas的read_html返回的是DataFrame列表,每个表格对应一个DataFrame,直接用to_csv方法就能完美导出,不需要手动处理字符串拆分:

import pandas as pd
import requests

# 获取网页内容
r = requests.get('http://10.45.87.12/og?sh=1&CallerName=&Sys=.79.83.86.51&')
# 提取所有HTML表格
df_list = pd.read_html(r.content)

# 遍历每个表格,分别写入CSV(多个表格可以按索引命名,避免覆盖)
for table_idx, df in enumerate(df_list):
    # to_csv参数说明:
    # - encoding='UTF-8' 保证中文/特殊字符编码正确
    # - sep=' ' 指定分隔符为空格
    # - index=False 不写入行索引
    # - header=True 写入表头
    df.to_csv(f"table_{table_idx}.csv", encoding='UTF-8', sep=' ', index=False, header=True)

方案二:手动处理行(适合自定义需求)

如果你一定要手动控制每行的写入逻辑,可以遍历DataFrame的行和列,过滤掉空值和纯空白内容,避免生成空字符串:

import pandas as pd
import csv
import requests

filename = "1.csv"
# 用with语句自动管理文件关闭,更安全
with open(filename, "w", encoding='UTF-8', newline='\n') as file:
    output = csv.writer(file, dialect='excel', delimiter=' ')
    r = requests.get('http://10.45.87.12/og?sh=1&CallerName=&Sys=.79.83.86.51&')
    pd.set_option('max_rows', 10000)
    df_list = pd.read_html(r.content)
    
    for df in df_list:
        # 先写入表头
        output.writerow(df.columns.tolist())
        # 遍历DataFrame的每一行
        for _, row in df.iterrows():
            # 把每行的每个值转为字符串并去除首尾空白,过滤掉空内容
            cleaned_row = [str(val).strip() for val in row.tolist() if str(val).strip()]
            output.writerow(cleaned_row)

问题根源解释

  1. 多余空字符串的原因:你把整个DataFrame转成字符串str(i)时,pandas会输出带格式的表格文本(包含大量用于对齐的空格、换行),用split(" ")拆分后,这些格式空格就会变成空字符串。
  2. 编码问题的原因:read_html已经能正确解析r.content中的UTF-8内容,生成的DataFrame里的字符串是正常的Unicode,手动encode('UTF-8').decode('UTF-8')属于画蛇添足,反而可能在某些场景下引发编码错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:18