如何在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
相关产品推荐
相关产品推荐

