如何使用pandas pd.read_html()将HTML转Dataframe时保留多余空格?
解决pd.read_html丢失连续空格的问题
pd.read_html默认会合并文本中的连续空格,这是因为它遵循HTML的默认渲染规则(连续空白字符会被合并为一个)。要保留这些空格,有两种可行的方案:
方案一:预处理HTML,替换连续空格为非换行空格实体
利用正则表达式把HTML中的连续空格替换成HTML非换行空格实体 (等价于 ),这样解析时会保留空格的数量:
import pandas as pd import re # 你的原始HTML内容 html = """<table> <tr> <td>35</td> <td>Juan Cruz</td> </tr> <tr> <td>23</td> <td>Philip Philips</td> </tr> </table>""" # 正则替换:把2个及以上的连续空格替换为对应数量的  processed_html = re.sub(r'(\s{2,})', lambda match: ' ' * len(match.group(1)), html) # 解析处理后的HTML df = pd.read_html(processed_html)[0] print(df)
方案二:用BeautifulSoup手动解析表格,精准控制文本提取
绕过pd.read_html的默认解析逻辑,直接用BeautifulSoup提取表格内容,手动保留连续空格:
import pandas as pd from bs4 import BeautifulSoup html = """<table> <tr> <td>35</td> <td>Juan Cruz</td> </tr> <tr> <td>23</td> <td>Philip Philips</td> </tr> </table>""" # 初始化BeautifulSoup解析器 soup = BeautifulSoup(html, 'lxml') table = soup.find('table') # 逐行逐单元格提取内容,保留中间连续空格 table_data = [] for row in table.find_all('tr'): cells = row.find_all('td') # 提取每个单元格的文本,仅去除首尾的缩进/换行,保留中间连续空格 row_content = [cell.get_text(strip=False).strip('\n\t ') for cell in cells] table_data.append(row_content) # 转换为DataFrame df = pd.DataFrame(table_data) print(df)
两种方案都能实现保留文本中的连续空格,方案二更灵活,适合复杂HTML结构的场景;方案一操作简单,适合结构简单的表格。
内容的提问来源于stack exchange,提问作者Ryuki Aquino
相关产品推荐
相关产品推荐

