Python提取XML中指定关键词对应的完整<profile>标签片段
问题根因
你现在写的逐行匹配逻辑,只能抓到单独包含关键词的行,没有识别<profile>标签的跨多行块边界,自然拿不到完整的节点片段。
实现代码
不需要安装第三方依赖,用状态标记逐行遍历文件就能实现需求:跟踪当前是否处于<profile>块内部,收集块内所有内容,遇到</profile>结束标签时判断块内有没有目标关键词,符合条件就把整个块存到结果里。
keyword = 'Georgia' result = [] # 状态标记变量 collecting = False current_block = [] hit_keyword = False with open('test_input.xml', 'r', encoding='utf-8') as f: for line in f: # 碰到profile开标签,启动块收集 if '<profile>' in line: collecting = True hit_keyword = False current_block = [line] if keyword in line: hit_keyword = True continue if collecting: current_block.append(line) if keyword in line: hit_keyword = True # 碰到profile闭标签,结束当前块收集 if '</profile>' in line: collecting = False if hit_keyword: result.append(''.join(current_block)) # 重置临时变量 current_block = [] hit_keyword = False # 写入结果文件 with open('test_output.xml', 'w', encoding='utf-8') as f: # 如果需要输出是格式合规的完整XML,就把下面两行注释打开,加个根节点包裹 # f.write('<project>\n') f.write('\n'.join(result)) # f.write('\n</project>')
运行效果
用你提供的源XML文件跑这段代码,输出结果和预期完全一致,会完整提取两个包含Georgia关键词的<profile>块,保留块内所有层级的内容和首尾标签,不会只抽取零散的单行内容。
适配说明
如果后续你的XML里<profile>标签带属性(比如<profile name="test">),只需要把开标签的判断条件从'<profile>' in line改成'<profile' in line就能兼容。如果需要输出严格合法的XML,放开代码里写根节点的注释即可。
内容的提问来源于stack exchange,提问作者mrcsk8
相关产品推荐
相关产品推荐

