python - 在使用 ElementTree 解析之前,如何检查 XML 中是否存在标签?
问题描述
我对 python 比较陌生,目前正在尝试解析 XML 并将其转换为 CSV。如果父标签和子标签存在,我的代码可以工作,但我收到以下错误消息:
Phone = element[3][0].text IndexError: 子索引超出范围
当标签存在于第一个属性中但不存在于第二个属性中时。
我试图输入一个 if 语句,但它并没有奏效。这就是 xml 和我的原始代码的样子。如果有人能指出我正确的方向,我将不胜感激!
XML 文件
<Member>
<Person>
<FirstName>JOHN</FirstName>
<LastName>DOE</LastName>
<Address>
<Address1>1234 TEST DR</Address1>
<Address2></Address2>
<City>SIMCITY</City>
<State>TD</State>
<ZipCode>12345 </ZipCode>
</Address>
<Phone>
<AreaCode>212</AreaCode>
<PhoneNumber>2223333</PhoneNumber>
</Phone>
</Person>
<Person>
<FirstName>JANE</FirstName>
<LastName>DOE</LastName>
<Address>
<Address1>1234 DEE ST</Address1>
<Address2></Address2>
<City>LCITY</City>
<State>TD</State>
<ZipCode>12345 </ZipCode>
</Address>
</Person>
</Member>
我的代码:
import csv
import xml.etree.ElementTree as ET
tree = ET.parse("Stack.xml")
root = tree.getroot()
xml_data_to_csv =open('Out.csv','w')
Csv_writer=csv.writer(xml_data_to_csv)
list_head=[]
count=0
for element in root.findall('Person'):
person = []
address_list = []
phone_list = []
#get head node
if count == 0:
FirstName = element.find('FirstName').tag
list_head.append(FirstName)
LastName = element.find('LastName').tag
list_head.append(LastName)
Address = element[2].tag
list_head.append(Address)
Phone = element[3].tag
list_head.append(Phone)
Csv_writer.writerow(list_head)
count = count +1
#get child node
FirstName = element.find('FirstName').text
person.append(FirstName)
LastName = element.find('LastName').text
person.append(LastName)
Address = element[2][0].text
address_list.append(Address)
Address2 = element[2][1].text
address_list.append(Address2)
City = element[2][2].text
address_list.append(City)
State = element[2][3].text
address_list.append(State)
ZipCode = element[2][4].text
address_list.append(ZipCode)
person.append(address_list)
Phone = element[3][0].text
phone_list.append(Phone)
AreaCode = element[3][1].text
phone_list.append(AreaCode)
person.append(phone_list)
#Write List_nodes to csv
Csv_writer.writerow(person)
xml_data_to_csv.close()
解决方案
尝试使用xpath查找您需要的标签,例如,您可以替换此代码:
Phone = element[3][0].text
phone_list.append(Phone)
AreaCode = element[3][1].text
phone_list.append(AreaCode)
person.append(phone_list)
像这样的东西:
phone_list = [e.text for e in element.findall('Phone//')]
person.append(phone_list)
还是它(在我看来是最好的选择):
person.append([e.text for e in element.findall('Phone//')])
因此,您将能够绕过错误并显着减少代码量:)
推荐阅读
- python - 我无法通过从列表中获取列名来创建表?(postgresql/psycopg2)
- python - python subprocess 'ssh' 不返回这样的文件或目录
- java - 描述其他类的类的模型
- python - 如何在python中的每个命令之后添加积分
- python - 筛选 pandas 数据框中列中的值大于 x 或 NaN 的行
- visual-studio-code - vscode+latex 研讨会中的意外片段行为
- sql - 识别sql中的关系
- r - 当日期在 x 轴上并且状态时,提取数据框中第一次出现变量的行
- c# - Bouncy Castle pem Reader 在读取公钥时抛出异常
- python - 从 google api 收到的列表中的嵌套字典未得到解析