Python3.6下如何用lxml.etree获取XML父标签的属性
使用lxml.etree获取XML父标签的属性(Python 3.6)
我来帮你完善这部分代码,结合你已经实现的请求XML、遍历元素的逻辑,咱们直接搞定父标签属性的获取:
核心思路
lxml.etree的元素对象自带getparent()方法可以直接拿到父节点,再用get()方法就能轻松取出指定属性值,完全不需要复杂的路径拼接。
完整示例代码
import requests from lxml import etree # 1. 你的请求XML逻辑(假设已经实现,这里直接复用) xml_url = "你的XML数据源地址" resp = requests.get(xml_url) resp.encoding = "utf-8" # 根据实际XML编码调整 # 2. 解析XML内容 xml_root = etree.fromstring(resp.content) # 3. 遍历目标元素(替换成你实际要处理的标签,比如//item) for target_elem in xml_root.xpath("//item"): # 获取直接父标签 parent_elem = target_elem.getparent() # 避免根节点无父标签的情况,加个判断 if parent_elem is not None: # 获取父标签的KEY、NAME属性,不存在则返回None(也可以设默认值) parent_key = parent_elem.get("KEY") parent_name = parent_elem.get("NAME", "未设置NAME属性") # 这里给NAME加了默认值 # 输出或处理结果 print(f"当前元素: {target_elem.tag}") print(f"父标签: {parent_elem.tag}") print(f"父标签KEY: {parent_key}") print(f"父标签NAME: {parent_name}") print("-" * 30)
扩展:获取所有祖先标签的属性
如果需要获取当前元素的所有父级祖先标签的属性,可以写个小循环来实现:
def get_all_ancestors(element): """获取元素的所有祖先节点,从直接父到根节点""" ancestors = [] current_parent = element.getparent() while current_parent is not None: ancestors.append(current_parent) current_parent = current_parent.getparent() return ancestors # 使用示例 for target_elem in xml_root.xpath("//item"): all_ancestors = get_all_ancestors(target_elem) print(f"元素{target_elem.tag}的所有祖先属性:") # 倒序遍历,从根节点到直接父节点 for idx, ancestor in enumerate(reversed(all_ancestors)): key = ancestor.get("KEY") name = ancestor.get("NAME", "无") print(f"第{idx+1}级祖先({ancestor.tag}): KEY={key}, NAME={name}") print("-" * 30)
关键方法说明
element.getparent():返回当前元素的直接父节点,根节点调用会返回None,记得加判断避免报错element.get(attr_name, default_value):获取元素的指定属性,第二个参数可选,用于设置属性不存在时的默认值
内容的提问来源于stack exchange,提问作者question.it
相关产品推荐
相关产品推荐

