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

使用Python ElementTree解析XML的CDATA段落并转换为CSV的问题求助

从含IMAGE子标签与CDATA的XML中提取TEXT内容并转CSV的解决方案

我明白你现在的困扰——XML里TEXT标签既有IMAGE子节点又有CDATA内容,原代码拿不到CDATA,删IMAGE还不小心把有用内容也删掉了。咱们一步步解决这个问题:

问题根源

你原代码里用sent.text只能获取TEXT节点下第一个子节点之前的空白文本,而CDATA内容其实是IMAGE节点的tail部分(或者TEXT节点后续的文本节点),原代码没捕获这部分。另外删除IMAGE时误删TEXT内容,是因为操作方式不对——只要精准移除IMAGE节点,TEXT里的CDATA会保留下来。

解决方案一:直接移除IMAGE节点后提取文本

这是最直观的方法:先找到TEXT下的IMAGE子节点并移除,剩下的TEXT内容就是你要的CDATA,直接提取即可。修改后的代码如下:

import os
import re
import xml.etree.ElementTree as ET
import csv

def make_csv(folderpath, xmlfilename, csvwriter, csv_file):
    # 解析XML文件
    tree = ET.parse(os.path.join(folderpath, xmlfilename))
    root = tree.getroot()
    
    for elem in root.findall("DOC"):
        rows = []
        text_node = elem.find("TEXT")
        
        if text_node is not None:
            # 找到TEXT下的IMAGE节点并移除
            image_node = text_node.find("IMAGE")
            if image_node is not None:
                text_node.remove(image_node)
            
            # 提取剩余文本(即CDATA内容)并清理格式
            sentence = text_node.text.strip() if text_node.text else ""
            sentence = re.sub('\n', '', sentence)
            rows.append(sentence)
        
        csvwriter.writerow(rows)
    
    csv_file.close()

解决方案二:过滤IMAGE节点,收集目标文本

如果不想修改XML结构,可以直接遍历TEXT下的节点,跳过IMAGE,只收集CDATA相关的文本内容:

import os
import re
import xml.etree.ElementTree as ET
import csv

def make_csv(folderpath, xmlfilename, csvwriter, csv_file):
    tree = ET.parse(os.path.join(folderpath, xmlfilename))
    root = tree.getroot()
    
    for elem in root.findall("DOC"):
        rows = []
        text_node = elem.find("TEXT")
        target_content = ""
        
        if text_node is not None:
            # 遍历TEXT的直接子节点
            for child in text_node:
                if child.tag == "IMAGE":
                    # IMAGE节点后的内容就是CDATA,直接取tail
                    if child.tail:
                        target_content += child.tail.strip()
                else:
                    # 处理TEXT下其他可能的文本节点
                    if child.text:
                        target_content += child.text.strip()
            
            # 清理换行符,整理成最终内容
            target_content = re.sub('\n', '', target_content)
            rows.append(target_content)
        
        csvwriter.writerow(rows)
    
    csv_file.close()

关键知识点

  • ElementTree解析XML时,CDATA会被当作普通文本节点处理;
  • 当标签下有子元素时,tag.text仅返回子元素前的文本,子元素后的文本需要通过child.tail获取;
  • 移除子节点(如IMAGE)时,调用parent_node.remove(child_node)只会删除该子节点,父节点的其他内容会完整保留。

内容的提问来源于stack exchange,提问作者Zahra Dehghani Tafti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:07:45