使用Python的BeautifulSoup提取XML指定元素并生成DataFrame
提取XML指定元素到DataFrame的简洁方案
给定如下XML数据:
xmlfile = ''' <Trainers> <Trainers name="VisitorID" value="NPRoiuKL213kiolkm2231"></Trainers> <Trainers name="VisitorNumber" value="BR-76594823-009922"></Trainers> <Trainers name="ServerIndex" value="213122"></Trainers> <Trainers name="VisitorPolicyID" value="ETR1234123"></Trainers> </Trainers> <Managers> <visitorstate>InProgress</visitorstate> <visitorrenewal lastupdated="2022-04-02"></visitorrenewal> <administrator>ROH</administrator> <carrier>Verizon</carrier> <carriernetwork>Verizon</carriernetwork> <carriergroupservice>Nokia</carriergroupservice> <programID>E3-ROH</programID> <RecordSystem>ATServer</RecordSystem> <ZipCode>ES2421</ZipCode> <SignerZipCode>ES2421</SignerZipCode> <RecieverZipCode>ES2421</RecieverZipCode> <version>19</version> <archived>false</archived> <SignalID>A3-213-3412</SignalID> <NetworkID>ProNetwork</NetworkID> <NetworkLocationID>ES2421</NetworkLocationID> <dataitem name="ProcessingVisitorId" value="Interior"></dataitem> <dataitem name="ProcessingVisitingInstance" value="eft-6"></dataitem> <Highlights> <Highlight name="ScreenLock" value="true"></Highlight> <Highlight name="locked" value="true"></Highlight> </Highlights> </Managers>'''
需要提取的目标元素列表(修正为字符串格式):
list_of_search_elements = ["VisitorID", "VisitorNumber", "ServerIndex", "VisitorPolicyID", "visitorrenewal", "carriernetwork", "ZipCode", "version", "NetworkLocationID", "ProcessingVisitingInstance", "ScreenLock"]
简洁实现方案
无需复杂的标签拆分逻辑,直接针对目标元素定位提取,同时完成存在性验证:
from bs4 import BeautifulSoup import pandas as pd # 初始化解析器 soup = BeautifulSoup(xmlfile, 'lxml') # 存储提取结果的列表 result_data = [] # 遍历目标元素逐个处理 for elem_name in list_of_search_elements: # 情况1:处理Trainers下的子元素(name属性匹配目标名) trainer_tag = soup.find('Trainers', {'name': elem_name}) if trainer_tag: result_data.append({ 'Group': 'Trainers', 'Name': elem_name, 'Value': trainer_tag.get('value') }) continue # 情况2:处理Managers下的直接子元素(标签名匹配目标名) manager_tag = soup.find(elem_name) if manager_tag: # 特殊处理visitorrenewal,取lastupdated属性 val = manager_tag.get('lastupdated') if elem_name == 'visitorrenewal' else manager_tag.text.strip() result_data.append({ 'Group': 'Managers', 'Name': elem_name, 'Value': val }) continue # 情况3:处理dataitem元素(name属性匹配目标名) dataitem_tag = soup.find('dataitem', {'name': elem_name}) if dataitem_tag: result_data.append({ 'Group': 'Managers', 'Name': elem_name, 'Value': dataitem_tag.get('value') }) continue # 情况4:处理Highlights下的Highlight元素(name属性匹配目标名) highlight_tag = soup.find('Highlight', {'name': elem_name}) if highlight_tag: result_data.append({ 'Group': 'Highlights', 'Name': elem_name, 'Value': highlight_tag.get('value') }) continue # 元素未找到的情况,记录验证结果 result_data.append({ 'Group': '未找到', 'Name': elem_name, 'Value': '元素不存在' }) # 转为DataFrame df = pd.DataFrame(result_data)
最终输出表格
| Group | Name | Value |
|---|---|---|
| Trainers | VisitorID | NPRoiuKL213kiolkm2231 |
| Trainers | VisitorNumber | BR-76594823-009922 |
| Trainers | ServerIndex | 213122 |
| Trainers | VisitorPolicyID | ETR1234123 |
| Managers | visitorrenewal | 2022-04-02 |
| Managers | carriernetwork | Verizon |
| Managers | ZipCode | ES2421 |
| Managers | version | 19 |
| Managers | NetworkLocationID | ES2421 |
| Managers | ProcessingVisitingInstance | eft-6 |
| Highlights | ScreenLock | true |
内容的提问来源于stack exchange,提问作者Hamza Ahmed
相关产品推荐
相关产品推荐

