xml 到 csv 的转换:'NoneType' 对象没有属性 'text'' - ElementTree

问题描述

我正在尝试学习如何将 xml 转换为 csv 格式并查找了一些教程。我正在执行以下操作,但出现错误'nonetype' 对象没有属性 'text''

所以部分 XML 文件如下(它实际上更大,但为了示例我缩小了它):


<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<ns2:export xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns="http://zakupki.gov.ru/oos/types/1">

-<ns2:fcsNotificationZK schemeVersion="1.0">

<id>27778</id>

<purchaseNumber>0373100113714000006</purchaseNumber>

<docpublishDate>2014-01-24T18:40:51.599+04:00</docpublishDate>

然后我正在编写以下代码获取标签标签信息:

import csv
import xml.etree.cElementTree as ET

tree = ET.parse("xml_notification_example.xml")
root = tree.getroot()

xml_data_to_csv = open('out.csv','w')
list_head = []
csv_writer = csv.writer(xml_data_to_csv)

count = 0

for element in root:
    list_nodes = []
    
    if count == 0:
        root.findall('id')
        list_head.append('id')

        root.findall('purchaseNumber')
        list_head.append('purchaseNumber')

        root.findall('docpublishDate')
        list_head.append('docpublishDate')
        
        csv_writer.writerow(list_head)
        count = +1
    
    iden = element.find('id').text
    list_nodes.append(iden)
    
    purchaseNumber = element.find('purchaseNumber').text
    list_nodes.append(purchaseNumber)
       
    docpublishDate = element.find('docpublishDate').text
    list_nodes.append(docpublishDate)
    
    csv_writer.writerow(list_nodes)

xml_data_to_csv.close()

我犯了一个错误

---> 19     iden = element.find('id').text
     20     list_nodes.append(iden)
     21 

AttributeError: 'nonetype' 对象没有属性 'text'

能否请你告诉我这里有什么问题,即使是直观的?

解决方法

xml 包含一个命名空间 xmlns="http://zakupki.gov.ru/oos/types/1"。因此,这需要在 find() 中引用。

尝试:

element.find('{http://zakupki.gov.ru/oos/types/1}id').text

输出:

'27778'

硬编码命名空间是凌乱和丑陋的。要使其动态化,请参阅 @Rik Poggi@Mark Ransom 的组合答案: Python: ElementTree,get the namespace string of an Element