如何用Python的BeautifulSoup提取XML并生成指定格式输出?
提取XML实体信息生成表格格式
问题背景
我有一个大型XML文件,已通过Python的BeautifulSoup库提取出指定部分,现在需要将<entity-list>下所有<entity>及其<property>信息转换成指定的表格格式。
现有提取代码
from bs4 import BeautifulSoup file = open("Physical document path", "r", encoding='utf-8') contents = file.read() soup = BeautifulSoup(contents, 'xml') titles = soup.find_all('entity-list', code='Organization') print(titles)
已过滤的XML内容
[<entity-list code="Organization"> <entity name="Energy Xxi Gulf Coast Inc"> <property code="sym">NASDAQ-NMS.EXXI</property> <property code="acorn">4286423188</property> <property code="use">primary</property> </entity> <entity name="Tema Oil and Gas Company"> <property code="acorn">1041746798</property> <property code="uacorn">1452918703</property> <property code="use">mention</property> </entity> <entity name="Rosehill Resources Inc"> <property code="sym">NASDAQ-SMALL.ROSE</property> <property code="acorn">5011400606</property> <property code="use">mention</property> </entity> <entity name="Energy Xxi (Bermuda) Limited"> <property code="acorn">0925670741</property> <property code="use">primary</property> </entity> <entity name="Epl Oil & Gas Inc."> <property code="acorn">3058472513</property> <property code="uacorn">4286423188</property> <property code="use">mention</property> </entity> <entity name="Patterson-UTI Energy Inc."> <property code="sym">NASDAQ-NMS.PTEN</property> <property code="acorn">3673909660</property> <property code="use">mention</property> </entity> <entity name="University of Illinois"> <property code="acorn">4117851479</property> <property code="use">mention</property> </entity> <entity name="Tulane University"> <property code="acorn">1572344836</property> <property code="use">mention</property> </entity> <entity name="Morgan Stanley & Co. LLC"> <property code="acorn">0308068010</property> <property code="uacorn">3605295726</property> <property code="use">mention</property> </entity> <entity name="Morgan Stanley"> <property code="sym">NYSE.APF</property> <property code="acorn">3605295726</property> <property code="use">parent</property> </entity> </entity-list>]
期望输出格式
| 实体名称 | sym | acorn | uacorn | use |
|---|---|---|---|---|
| Energy Xxi Gulf Coast Inc | NASDAQ-NMS.EXXI | 4286423188 | - | primary |
| Tema Oil and Gas Company | - | 1041746798 | 1452918703 | mention |
| Rosehill Resources Inc | NASDAQ-SMALL.ROSE | 5011400606 | - | mention |
解决方案代码
方法1:生成Markdown表格
from bs4 import BeautifulSoup # 读取并解析XML file = open("Physical document path", "r", encoding='utf-8') contents = file.read() soup = BeautifulSoup(contents, 'xml') entity_list = soup.find('entity-list', code='Organization') # 收集所有实体数据 entities_data = [] columns = ['实体名称', 'sym', 'acorn', 'uacorn', 'use'] for entity in entity_list.find_all('entity'): entity_info = {'实体名称': entity.get('name')} # 遍历当前实体的所有属性 for prop in entity.find_all('property'): code = prop.get('code') entity_info[code] = prop.text.strip() # 补全缺失的列,用'-'填充 for col in columns[1:]: if col not in entity_info: entity_info[col] = '-' entities_data.append(entity_info) # 生成Markdown表格 markdown_table = '| ' + ' | '.join(columns) + ' |\n' markdown_table += '| ' + ' | '.join(['---']*len(columns)) + ' |\n' for data in entities_data: row = [data[col] for col in columns] markdown_table += '| ' + ' | '.join(row) + ' |\n' # 输出表格 print(markdown_table) # 保存到文件 with open('entity_table.md', 'w', encoding='utf-8') as f: f.write(markdown_table)
方法2:用Pandas导出为Excel等格式
如果需要更灵活的导出选项,可使用Pandas:
from bs4 import BeautifulSoup import pandas as pd file = open("Physical document path", "r", encoding='utf-8') contents = file.read() soup = BeautifulSoup(contents, 'xml') entity_list = soup.find('entity-list', code='Organization') entities_data = [] for entity in entity_list.find_all('entity'): entity_info = {'实体名称': entity.get('name')} for prop in entity.find_all('property'): entity_info[prop.get('code')] = prop.text.strip() entities_data.append(entity_info) # 转换为DataFrame并整理格式 df = pd.DataFrame(entities_data) df = df[['实体名称', 'sym', 'acorn', 'uacorn', 'use']].fillna('-') # 输出Markdown表格到控制台 print(df.to_markdown(index=False)) # 导出到Excel文件 df.to_excel('entities_table.xlsx', index=False, encoding='utf-8')
代码说明
- 定位目标
<entity-list>节点; - 遍历每个
<entity>,提取name属性作为“实体名称”; - 遍历实体下的所有
<property>,以code为键、文本内容为值存入字典; - 补全缺失属性列,用
-填充空值; - 生成Markdown表格或用Pandas导出为Excel等格式。
内容的提问来源于stack exchange,提问作者Ravi Shah
相关产品推荐
相关产品推荐

