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

如何在Python中将pandas单个单元格内的多类数据拆分至不同列

可以通过保留HTML元素的分隔结构、按固定字段前缀匹配的方式拆分信息,不需要提前合并所有文本再拆分,修改后的实现代码如下:

import bs4
from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd

url = "https://education.scripps.edu/alumni/graduate-alumni-list/index.html"
page = urlopen(url)
html = page.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")

# 按行遍历表格,每一行对应一个校友的完整信息
rows = soup.find('tbody').find_all('tr')
parsed_data = []

for row in rows:
    tds = row.find_all('td')
    # 过滤无效空行
    if len(tds) < 4:
        continue
    # 提取姓名字段
    name = tds[1].get_text(strip=True)
    info_block = tds[3]
    # 初始化所有目标字段
    info_dict = {
        "姓名": name,
        "项目": "",
        "答辩年份": "",
        "导师": "",
        "论文标题": "",
        "本科院校": ""
    }
    # 提取被<br>、<strong>标签分隔的所有独立文本片段,过滤空值
    info_parts = [part.strip() for part in info_block.strings if part.strip()]
    # 按固定字段前缀匹配取值
    for part in info_parts:
        if part.startswith("Program:"):
            info_dict["项目"] = part.replace("Program:", "").strip()
        elif part.startswith("Degree Year:"):
            info_dict["答辩年份"] = part.replace("Degree Year:", "").strip()
        elif part.startswith("Advisor:"):
            info_dict["导师"] = part.replace("Advisor:", "").strip()
        elif part.startswith("Thesis Title:"):
            info_dict["论文标题"] = part.replace("Thesis Title:", "").strip()
        elif part.startswith("Undergraduate Institution:"):
            info_dict["本科院校"] = part.replace("Undergraduate Institution:", "").strip()
    parsed_data.append(info_dict)

# 生成结构化DataFrame
df = pd.DataFrame(parsed_data)
# 清除全空无效行
df = df.dropna(how='all').reset_index(drop=True)

这个实现不再直接拉平所有元素合并文本,避免了标签分隔的结构丢失和信息对应错乱的问题。如果存在部分数据缺失字段的情况,对应列会自动留空,不影响整体解析逻辑。如果后续网页字段格式有小范围变动,调整前缀匹配规则即可适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:21:00