使用pandas.read_html时如何处理td标签内嵌套多个p标签的问题
结论
pandas的read_html()没有内置参数支持直接为<td>内嵌套的多个<p>标签内容添加分隔符,它底层调用的文本提取逻辑会直接拼接所有子节点的文本内容,默认不会插入分隔符。
可行解决方案
方案1:预处理HTML源码后传入read_html(改动最小)
先将页面源码中<p>标签的相邻边界替换为你需要的分隔符(空格、特殊标识均可),再把处理后的源码传给read_html()即可,示例代码如下:
import re import requests import pandas as pd # 获取原始页面源码 raw_html = requests.get("目标页面URL").text # 正则替换所有p标签相邻边界为空格,自动忽略标签之间的空白字符 processed_html = re.sub(r'</p>\s*<p>', ' ', raw_html) # 传入处理后的源码解析表格 df_list = pd.read_html(processed_html)
如果需要后续拆分文本,可以替换为||之类不会和正文内容冲突的特殊分隔符,后续再用str.split()拆分即可。
方案2:自定义解析表格(灵活性最高)
如果表格嵌套结构复杂,预处理容易误改其他内容,可以自行用BeautifulSoup遍历解析表格,完全控制单元格内容的拼接逻辑:
from bs4 import BeautifulSoup import requests import pandas as pd soup = BeautifulSoup(requests.get("目标页面URL").text, "lxml") # 定位目标表格,可根据id、class等属性筛选 target_table = soup.find("table", attrs={"id": "你要的表格id"}) table_data = [] for tr in target_table.find_all("tr"): row_data = [] for cell in tr.find_all(["th", "td"]): # 提取所有p标签文本后用空格拼接 p_content = [p.get_text(strip=True) for p in cell.find_all("p")] cell_content = " ".join(p_content) if p_content else cell.get_text(strip=True) row_data.append(cell_content) table_data.append(row_data) # 转换为DataFrame,若第一行是表头可调整columns参数 df = pd.DataFrame(table_data[1:], columns=table_data[0])
内容的提问来源于stack exchange,提问作者Tushar Marpaka
相关产品推荐
相关产品推荐

