You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

关键改进点

  1. 节点级处理:不再拆分属性和文本列表,针对每个<comment>独立处理,确保category与内容的对应关系绝对正确。
  2. 精准场景判断:通过检查当前节点是否包含cv-term或xref-list子节点,精准匹配三种嵌套场景。
  3. 文本清理:用strip()去除文本中的多余换行、空格,避免无效内容干扰输出。
  4. 顺序一致性:完全遵循XML中<comment>节点的原始顺序输出,彻底解决错位问题。

测试该代码后,即可得到你期望的有序输出结果。

内容的提问来源于stack exchange,提问作者szuszfol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:37:30