如何用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)
问题根源解释
- 多余空字符串的原因:你把整个DataFrame转成字符串
str(i)时,pandas会输出带格式的表格文本(包含大量用于对齐的空格、换行),用split(" ")拆分后,这些格式空格就会变成空字符串。 - 编码问题的原因:
read_html已经能正确解析r.content中的UTF-8内容,生成的DataFrame里的字符串是正常的Unicode,手动encode('UTF-8').decode('UTF-8')属于画蛇添足,反而可能在某些场景下引发编码错误。
内容的提问来源于stack exchange,提问作者johnred
相关产品推荐
相关产品推荐

