如何在python中使用elementtree将节点的子节点合并到csv单元的一个单元中?

2024-05-29 03:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次真正使用XML,我似乎不知所措。我在python中使用elementtree,可以解析不同的节点,甚至可以将它们放到csv中,但是我在处理子节点(或者子节点)时遇到了问题属于<;text>;,即<;p>;。你知道吗

在查看elementtree的文档时:

for content in root.iter('p'):
    print content.text

获取所需内容,即节点中的所有文本<;text>;。但是,当我的代码写入csv文件时,会为每个<;p>;文件创建一个新行;。太好了!但是我希望每个<;text>;都是自己的行,并且每个<;text>;行的一个单元格中都有来自其子项<;p>;的所有文本。我希望这是有道理的(我几乎把自己搞糊涂了…又一次)。你知道吗

下面是我的简单代码:

import xml.etree.ElementTree as ET
import csv

tree = ET.parse('the_example.xml')
root = tree.getroot()

with open('throw_it_all_in_this.csv', 'wb') as f:
    writer = csv.writer(f)   
    for content in root.iter('p'):
        print content.text
        writer.writerow([content.text])

下面是_示例.xml我的工作对象是:

<?xml version="1.0" encoding="ISO-8859-1"?>
 <example>
  <item>
   <source>some site</source>
   <subject>Lorem ipsum dolor sit amet.</subject>
   <subjectcode>EN</subjectcode>
   <text>
    <p>
      Nam urna tellus, dignissim eu dolor nec, elementum posuere magna. Integer euismod ipsum 
      in lorem scelerisque efficitur.
    </p>
      <p>
        &amp;lt;
        <p>
          In hac habitasse platea dictumst. Nam sed iaculis diam, eget viverra 
          dolor. Vestibulum rutrum dolor. 
        </p>
        &amp;gt;
      </p>
    <p>
      Maecenas nisi dolor, pulvinar et diam vel, lacinia fringilla tellus. Quisque 
      feugiat id est in molestie. Aliquam eleifend lectus sed ex aliquam egestas. 
      Integer euismod ipsum in lorem scelerisque efficitur.
    </p>
    <p>
      Duis lobortis rutrum turpis, sit amet iaculis nibh pulvinar at. Cras euismod 
      semper nibh, quis maximus nisi ultrices nec. Curabitur sed nisl molestie, ullamcorper 
      dui nec, vestibulum mi. Proin quis efficitur turpis, quis aliquam purus. Curabitur 
      id faucibus lacus, posuere ullamcorper eros.
    </p>
    <p>
      Nam ullamcorper accumsan magna, quis bibendum nibh. Mauris finibus iaculis est, nec 
      consequat leo ultricies a. Etiam id sagittis mi. Mauris quis justo suscipit, placerat 
      est vitae, aliquet nunc. Aenean tincidunt leo erat, id dictum mi iaculis nec. Class 
      aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
    </p>
   </text>
  </item>

Tags: csvtextinltgtid节点root
1条回答
网友
1楼 · 发布于 2024-05-29 03:32:56

迭代text标记,并在text标记中找到p标记。使用^{}组合它们:

....
for content in root.iter('text'):
    writer.writerow(['\n'.join(p.text for p in content.iter('p'))])

更新

根据OP的commnet,要处理TypeErrorUnicodeEncodeErrorOP应该使用以下命令:

writer.writerow(['\n'.join(p.text for p in content.iter('p')
                 if p.text is not None).encode('utf-8')])

相关问题 更多 >

    热门问题