使用Python的lxml解析XML时多嵌套评论节点提取问题
问题根源
你的代码出现顺序混乱的核心原因是把所有<comment>的属性和文本分别提取成独立列表后强行配对——不同<comment>对应的内容来源(直接文本、<cv-term>内容、<xref>相关内容)分散在不同列表中,它们的顺序无法和comment_cat列表的顺序一一对应,自然会出现错位。
解决方案:逐个遍历处理每个<comment>节点
正确的思路是:遍历XML中的每一个<comment>节点,针对单个节点判断它属于哪一种嵌套场景,提取对应内容后直接组合成目标格式,这样既能保证每个category和内容正确关联,又能严格遵循XML中的原始顺序。
修改后的代码如下:
# 先获取所有<comment>节点,而非拆分提取属性和文本 comments = att.xpath('.//comment-list/comment') comment_results = [] for comment in comments: # 提取当前comment的category属性 category = comment.get('category') if not category: continue # 跳过无category属性的节点 # 判断当前comment所属场景 has_cv_term = len(comment.xpath('./cv-term')) > 0 has_xref_list = len(comment.xpath('./xref-list')) > 0 # 场景1:无子节点的comment(既无cv-term也无xref-list) if not has_cv_term and not has_xref_list: # 提取并清理标签间文本(去除多余换行和空格) raw_text = ''.join(comment.xpath('./text()')) clean_text = raw_text.strip() if clean_text: comment_results.append(f"{category}: {clean_text}") continue # 场景2:包含<cv-term>子节点的comment if has_cv_term: cv_node = comment.xpath('./cv-term')[0] # 提取cv-term的属性与文本 terminology = cv_node.get('terminology', '') accession = cv_node.get('accession', '') cv_text = ''.join(cv_node.xpath('./text()')).strip() # 组合成目标格式 content = f"{terminology}, {accession}, {cv_text}" comment_results.append(f"{category}: {content}") continue # 场景3:包含<xref-list>多层嵌套的comment if has_xref_list: xref_node = comment.xpath('./xref-list/xref')[0] # 提取xref的属性 database = xref_node.get('database', '') accession = xref_node.get('accession', '') # 提取property的value属性 property_value = comment.xpath('./xref-list/xref/property-list/property/@value')[0] # 组合成目标格式 content = f"{database}, {accession}, {property_value}" comment_results.append(f"{category}: {content}") # 用;;连接最终结果 key_values['Comments'] = ';; '.join(comment_results)
关键改进点
- 节点级处理:不再拆分属性和文本列表,针对每个
<comment>独立处理,确保category与内容的对应关系绝对正确。 - 精准场景判断:通过检查当前节点是否包含
cv-term或xref-list子节点,精准匹配三种嵌套场景。 - 文本清理:用
strip()去除文本中的多余换行、空格,避免无效内容干扰输出。 - 顺序一致性:完全遵循XML中
<comment>节点的原始顺序输出,彻底解决错位问题。
测试该代码后,即可得到你期望的有序输出结果。
内容的提问来源于stack exchange,提问作者szuszfol
相关产品推荐
相关产品推荐

