【问题标题】:Parsing XML CDATA section and convert it to CSV using ElementTree python解析 XML CDATA 部分并使用 ElementTree python 将其转换为 CSV
【发布时间】:2021-10-21 02:53:21
【问题描述】:

我想将 XML 文件转换为 CSV 文件。我的 XML 文件由不同的标签组成,我选择了其中一些对我的工作有用的标签。我只想访问 TEXT 标签之间的文本内容。我的问题是我不知道如何访问 CDATA 内容。因为某些文档中的 TEXT 有一个 IMAGE 子项,所以当我运行我的代码时,它只会解析 IMAGE 标记并在我用 pandas 读取我的 CSV 文件时显示 NaN。我搜索了 CDATA,但找不到任何标记来告诉解析器跳过 IMAGE 标记并仅提取 CDATA 部分中的内容。另外,我尝试从 TEXT 中删除 IMAGE 标记以解决问题,但是当我这样做时,它删除了所有 TEXT 内容,以及 CDATA 部分。

我的 XML 模式如下:

<root>
<DOC>
<TEXT>
<IMAGE>/1379/791012/p18-1.jpg</IMAGE>
<![CDATA[The section I want to access to]]>
</TEXT>
</DOC>
</root>

还有,这是我的解析代码:

def make_csv(folderpath, xmlfilename, csvwriter, csv_file):
  
  rows = []

  #Parse XML file
  tree = ET.parse(os.path.join(folderpath, xmlfilename))
  root = tree.getroot()
  
  for elem in root.findall("DOC") :
    rows = []

    sentence = elem.find("TEXT")
    if sentence != None:
        sentence = re.sub('\n', '', sent.text)
    rows.append(sentence)

    csvwriter.writerow(rows)
  csv_file.close()

感谢您的帮助。

【问题讨论】:

  • 这种 XML 结构看起来并不特别适合 CSV。 CSV 文件无法包含 NaN,因此您可能正在用 Excel 之类的脑残软件打开它。你能edit你的问题显示预期的输出格式吗? (并且,查看您的代码,可能会考虑该特定格式是否有意义。)
  • 您还有另一个错误:您正在追加到 rows 并在循环的每次迭代中写出逐渐变长的行列表。可能只是将sentence 写为新行?

标签: python xml csv elementtree cdata


【解决方案1】:

我的问题是我不知道如何访问 CDATA 内容。因为某些 DOC 中的 TEXT 有一个 IMAGE 子项

以下似乎有效。代码处理了TEXT下的IMAGE和TEXT下没有IMAGE的情况。

import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<root>
   <DOC>
      <TEXT>
         <IMAGE>/1379/791012/p18-1.jpg</IMAGE>
         <![CDATA[The section I want to access to]]>
      </TEXT>
      <TEXT>
         <![CDATA[more text]]>
      </TEXT>
   </DOC></root>'''

root = ET.fromstring(xml)
texts = root.findall('.//TEXT')
for idx, text in enumerate(texts, start=1):
    data = list(text)[0].tail.strip() if list(text) else text.text.strip()
    print(f'{idx}) {data}')

输出

1) The section I want to access to
2) more text

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2023-01-12
    • 2017-02-15
    • 2021-03-06
    • 1970-01-01
    • 2021-02-06
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多