使用Beautiful Soup提取XML同名标签数据并存入DataFrame的问题
现有代码问题说明
现有代码主要存在以下几个问题导致结果不符合预期:
- 选用
html.parser解析XML结构适配性差,且标签大小写处理逻辑容易出错 - 查找附加字段时使用全局
soup对象检索,会返回整个文档所有节点的附加字段,而非当前遍历到的<Value>节点下的字段 - 直接取
value.uniquealias.text只会返回第一个<UniqueAlias>标签的内容,无法适配两个标签顺序不固定的场景 - 按索引取附加字段值完全依赖字段出现顺序,一旦不同
<Value>节点下的附加字段数量/顺序发生变化,就会出现取值错位
正确实现方案
首先安装依赖(如果未安装):
pip install beautifulsoup4 lxml pandas
完整代码如下:
import pandas as pd from bs4 import BeautifulSoup # 读取响应内容 text = response.content # 用lxml-xml解析器处理XML,自动保留标签大小写、识别CDATA内容 soup = BeautifulSoup(text, "lxml-xml") data = [] # 遍历所有Value节点 for value in soup.find_all('Value'): # 1. 提取ref属性 ref_id = value['ref'] # 2. 提取ORG值:遍历所有UniqueAlias筛选以ORG=开头的内容 org_val = None for alias in value.find_all('UniqueAlias'): alias_text = alias.text.strip() if alias_text.startswith('ORG='): org_val = alias_text.split('=', 1)[1] break # 3. 提取Hierarchy标签文本 hierarchy_val = value.find('Hierarchy').text.strip() if value.find('Hierarchy') else None # 4、5. 按label属性提取对应附加字段,不依赖顺序 country_val = None prstatus_val = None for field in value.find_all('AdditionalField'): label = field.get('label', '') if label == 'Country': country_val = field.text.strip() elif label == 'PrStatus': prstatus_val = field.text.strip() data.append([ref_id, org_val, hierarchy_val, country_val, prstatus_val]) # 生成DataFrame df = pd.DataFrame(data, columns=['ID', 'Org', 'Hierarchy', 'Country', 'PrStatus']) print(df)
内容的提问来源于stack exchange,提问作者SKR -
相关产品推荐
相关产品推荐

