Python爬取网页表格时如何清除\r\n\r\n字符并生成规范DataFrame
网页表格爬取的转义符问题与修复方案
转义字符的来源
这类\r\n\r\n不是代码凭空生成的,是目标网页的HTML源码本身在单元格内容前后就加了换行、缩进来做代码排版——你原来的代码用get_text()直接提取文本时,会把这些源码里的空白字符完整扒下来,没有做针对性清洗,所以就混在最终输出的文本里了。
除了转义符问题,你当前的代码还有两个明显的逻辑问题:
- 拿到行里的所有
<td>单元格后,直接把整组标签转成了字符串再取文本,相当于把整行的所有列内容合并成了一整个长字符串,没有拆成独立列,所以才会看到所有数据挤在同一列里 - 没有过滤空行、也没有单独区分开头的赛事统计信息(完赛人数、男女参赛数等),导致有效的赛事表格数据被非数据内容混杂
可直接复现的修正实现
直接替换你原有循环提取、生成DataFrame的代码段即可:
listnew = [] for row in rows: row_td = row.find_all('td') # 跳过无有效单元格的空行 if not row_td: continue cleaned_row = [] for cell in row_td: # 逐单元格提取文本,替换所有回车、换行转义符 cell_text = cell.get_text().replace('\r', '').replace('\n', '').strip() # 合并多余连续空格,清理人名前后的缩进 cell_text = ' '.join(cell_text.split()) cleaned_row.append(cell_text) listnew.append(cleaned_row) # 按最长行长度统一列数,避免行长度不一致导致的错位 max_col = max(len(row) for row in listnew) padded_data = [row + [''] * (max_col - len(row)) for row in listnew] df = pd.DataFrame(padded_data) # 自动定位表格真实表头行,分离统计信息与有效赛事数据 header_idx = None for idx, row in enumerate(listnew): if 'Name' in row: header_idx = idx break # 应用表头、截取有效数据段 df.columns = df.iloc[header_idx] df_clean = df.iloc[header_idx+1:].reset_index(drop=True)
处理效果
- 所有
\r、\n转义符会被完全移除 - 单元格内多余的连续空格会被自动合并,人名、成绩、排名等字段会被拆分为独立列,不会出现整串文本挤在同一单元格的问题
- 开头的完赛人数、性别参赛统计信息会被自动排除在有效结构化数据之外,最终生成的
df_clean可以直接用于后续数据分析
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

