python - Python:“NoneType”对象没有属性“文本”,XML 解析
问题描述
我正在尝试使用 Spirit 获取 XML 文件,解析数据并输出为 csv 文件。我觉得我忽略了一些容易的事情。我有一个错误:
Traceback (most recent call last):
File "xml2csv.py", line 12, in <module>
name = i.find("spirit:name").text
AttributeError: 'NoneType' object has no attribute 'text'
示例 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<spirit:component xmlns="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5"
xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5/memoryMap.xsd">
>
<spirit:generic>
<spirit:name>GENERIC_NAME</spirit:name>
<spirit:description>GENERIC_DESCRIPTION</spirit:description>
</spirit:generic>
</spirit:component>
我的 Python 代码:
# Importing the required libraries
import xml.etree.ElementTree as Xet
import pandas as pd
cols = ["name", "description"]
rows = []
# Parsing the XML file
xmlparse = Xet.parse('xml_sample.xml')
root = xmlparse.getroot()
for i in root:
name = i.find("spirit:name").text
description = i.find("spirit:description").text
rows.append({"spirit:name": name,
"spirit:description": description})
df = pd.DataFrame(rows, columns=cols)
# Writing dataframe to csv
df.to_csv('output.csv')
根据我正在阅读的其他一些线程,我怀疑我的错误出在我的“.text”中。但是,删除它会导致我的 .csv 文件不显示任何数据。
CSV:
,name,description
0,,
任何建议将不胜感激。有点坚持这一点。
解决方案
下面似乎工作。注意代码使用的命名空间:{http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5}
import xml.etree.ElementTree as ET
import pandas as pd
xml = '''<?xml version="1.0" encoding="utf-8"?>
<spirit:component xmlns="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5"
xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5/memoryMap.xsd">
>
<spirit:generic>
<spirit:name>GENERIC_NAME</spirit:name>
<spirit:description>GENERIC_DESCRIPTION</spirit:description>
</spirit:generic>
</spirit:component>'''
cols = ["name", "description"]
rows = []
root = ET.fromstring(xml)
names = [x.text for x in root.findall('.//{http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5}name')]
descriptions = [x.text for x in root.findall('.//{http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.5}description')]
for entry in zip(names, descriptions):
rows.append({'name': entry[0], 'description': entry[1]})
df = pd.DataFrame(rows, columns=cols)
print(df)
输出
name description
0 GENERIC_NAME GENERIC_DESCRIPTION
推荐阅读
- reactjs - TypeError:无法读取反应中未定义的属性“过滤器”
- algorithm - 2个方向均匀排列步数的算法
- linux - 不能用厨师设置 GOPATH
- led - Num Lock 开启,但 Num Lock LED 关闭
- spring-mvc - 我的请求@RequestMapping(value = {"/", "/home", "/index"})
- c# - C# TCP 连接丢失
- amazon-web-services - AWS EC2实例中的Kubernetes仪表板?
- reactjs - 如何读取在 React JS 项目中连续一段时间后更新的 json 文件
- asp.net-core - 启用 CORS 但没有效果
- matlab - 绘制颤动极坐标