如何用BeautifulSoup正确解析XML并生成完整结构化Pandas表格?
解决BeautifulSoup解析XML仅返回段落最后一项的问题
问题背景
使用BeautifulSoup解析XML文件时,已能解析各层级文本列,但当前代码仅返回每个段落的最后一项,无法生成包含所有条目的结构化Pandas表格。
问题代码片段
row = {} for para in soup.find_all('paragraph'): row['para_title'] = para.find('title').text for item in para.find_all('content_item'): row['item_content'] = item.text df = pd.DataFrame([row])
当前输出
para_title item_content 0 段落1标题 段落1最后一项内容
期望输出
para_title item_content 0 段落1标题 段落1第一项内容 1 段落1标题 段落1第二项内容 2 段落2标题 段落2第一项内容
XML文件内容
<root> <paragraph> <title>段落1标题</title> <content_item>段落1第一项内容</content_item> <content_item>段落1第二项内容</content_item> </paragraph> <paragraph> <title>段落2标题</title> <content_item>段落2第一项内容</content_item> </paragraph> </root>
完整代码
from bs4 import BeautifulSoup import pandas as pd with open('data.xml', 'r', encoding='utf-8') as f: xml_content = f.read() soup = BeautifulSoup(xml_content, 'xml') row = {} for para in soup.find_all('paragraph'): row['para_title'] = para.find('title').text for item in para.find_all('content_item'): row['item_content'] = item.text df = pd.DataFrame([row]) print(df)
问题原因
代码仅初始化了一个row字典,在内层循环遍历条目时,每次都会覆盖row['item_content']的值;外层循环也会持续覆盖para_title,最终只保留了整个XML中最后一个段落的最后一项内容。
修正方案
初始化一个空列表存储所有条目,在内层循环中每次创建新的字典,将当前段落信息和条目内容存入后追加到列表,最后用完整列表生成DataFrame。
修正后的完整代码:
from bs4 import BeautifulSoup import pandas as pd with open('data.xml', 'r', encoding='utf-8') as f: xml_content = f.read() soup = BeautifulSoup(xml_content, 'xml') # 初始化空列表存储所有数据条目 data_list = [] for para in soup.find_all('paragraph'): para_title = para.find('title').text # 遍历当前段落下的所有条目 for item in para.find_all('content_item'): # 每次循环创建新字典,避免数据覆盖 row = { 'para_title': para_title, 'item_content': item.text } data_list.append(row) # 用完整的数据列表生成结构化DataFrame df = pd.DataFrame(data_list) print(df)
验证输出
运行修正后的代码,将得到与期望一致的结构化表格:
para_title item_content 0 段落1标题 段落1第一项内容 1 段落1标题 段落1第二项内容 2 段落2标题 段落2第一项内容
内容的提问来源于stack exchange,提问作者pyj
相关产品推荐
相关产品推荐

