使用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
相关产品推荐
相关产品推荐

