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

从多XML文件提取关键词并构建嵌套列表结构技术求助

解决XML关键词提取与嵌套列表结构构建问题

我看你现在的核心问题是没搭建好对应多字段的字典结构,而且原代码里的关键词提取逻辑没按每个文件分组存成子列表,最后变成了扁平的单层列表。咱们一步步来修正:

原代码的问题分析

  • 只处理了keywords字段,完全没提取symbol、jobno这些你需要的其他标签内容
  • 初始化的keywords = [[] for i in range(4)]根本没发挥作用,后续直接用append()把所有关键词堆进了一个列表,丢失了「每个文件对应一个关键词子列表」的层级

修正后的完整代码

import glob
import os
import xml.etree.ElementTree as et

# 替换成你的XML文件所在路径
xml_path = "path/to/your/xml/files"

# 初始化结果字典,每个字段对应空列表,keywords用来存每个文件的关键词子列表
result_dict = {
    'symbol': [],
    'jobno': [],
    'dat': [],
    'language': [],
    'keywords': []
}

# 遍历所有XML文件
for xml_file in glob.glob(os.path.join(xml_path, '*.xml')):
    tree = et.parse(xml_file)
    root = tree.getroot()
    
    # 提取单个值类型的字段(处理标签可能不存在的情况,避免报错)
    # 这里的XPath路径请根据你的实际XML结构调整,比如如果symbol在特定父节点下要修改路径
    symbol_val = root.find(".//symbol").text if root.find(".//symbol") is not None else ""
    jobno_val = root.find(".//jobno").text if root.find(".//jobno") is not None else ""
    dat_val = root.find(".//dat").text if root.find(".//dat") is not None else ""
    language_val = root.find(".//language").text if root.find(".//language") is not None else ""
    
    # 将单个字段值添加到对应列表
    result_dict['symbol'].append(symbol_val)
    result_dict['jobno'].append(jobno_val)
    result_dict['dat'].append(dat_val)
    result_dict['language'].append(language_val)
    
    # 提取当前文件的所有关键词,组成子列表
    current_file_keywords = []
    # 这里的XPath要匹配你XML里关键词的结构,比如如果是<keywords><kw>xxx</kw></keywords>就改成.//keywords/kw
    for keyword_node in root.find(".//keywords"):
        if keyword_node.text is not None:
            # 用strip()去除文本前后的空格/换行符,让结果更干净
            current_file_keywords.append(keyword_node.text.strip())
    
    # 将当前文件的关键词子列表添加到总keywords列表中
    result_dict['keywords'].append(current_file_keywords)

# 打印结果验证结构
print(result_dict)

关键说明

  1. 字典初始化:直接创建包含所有需要字段的字典,每个字段对应空列表,这样能清晰对应你期望的输出结构
  2. 按文件分组提取关键词:每个XML文件单独生成一个关键词子列表,再把这个子列表添加到result_dict['keywords']中,就能得到「列表的列表」的层级
  3. 容错处理:用if root.find(...) is not None判断标签是否存在,避免因某个文件缺少标签导致代码报错
  4. XPath调整:请根据你实际的XML标签结构修改XPath路径,比如如果关键词是放在<keywords>下的<keyword>子标签里,那遍历的时候要写成root.findall(".//keywords/keyword")(注意这里用findall而不是find,因为要获取所有子节点)

这样处理后,你就能得到和期望完全一致的结构了——每个字段都是对应所有文件的列表,keywords是每个文件关键词子列表组成的嵌套列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:01:09