提问人:PracticingPython 提问时间:6/3/2021 最后编辑:PracticingPython 更新时间:6/11/2021 访问量:58
从 xml 中提取索引数据时出现问题
Issues indexing data extract from xml
问:
我正在处理一些最终将加载到 csv 中的 XML 数据。当条目中不存在元素时,我在正确索引数据时遇到了问题。下面是我正在使用的一个简单的 xml 示例
<root>
<entry>
<LASTNAME>Doe</LASTNAME>
<FIRSTNAME>Jon</FIRSTNAME>
<GENDER>M</GENDER>
</entry>
<entry>
<LASTNAME>Doe</LASTNAME>
<FIRSTNAME>Jane</FIRSTNAME>
<GENDER>F</GENDER>
<HAIRCOLOR>Blonde</HAIRCOLOR>
</entry>
</root>
我最终得到的输出如下:
姓氏 | 名字 | 性 | 染发剂 |
---|---|---|---|
母鹿 | John | M | 金发 |
母鹿 | 珍 | F |
但正确的输出应该是:
姓氏 | 名字 | 性 | 染发剂 |
---|---|---|---|
母鹿 | John | M | |
母鹿 | 珍 | F | 金发 |
所以我似乎有一个索引问题,在搜索 HAIRCOLOR(取决于页面上存在的 HAIRCOLOR 元素的数量)的前几次,它会沿着 XML 向下移动,直到找到一个,但当它到达条目末尾时它应该停止。
这是我正在使用的代码:
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ParseError
from xml.etree import ElementTree
bytes_ = '''
<root>
<entry>
<LASTNAME>Doe</LASTNAME>
<FIRSTNAME>Jon</FIRSTNAME>
<GENDER>M</GENDER>
</entry>
<entry>
<LASTNAME>Doe</LASTNAME>
<FIRSTNAME>Jane</FIRSTNAME>
<GENDER>F</GENDER>
<HAIRCOLOR>Blonde</HAIRCOLOR>
</entry>
</root>
'''
xpaths = [
"./entry/LASTNAME",
"./entry/FIRSTNAME",
"./entry/GENDER",
"./entry/HAIRCOLOR"
]
data = []
_fields = [
{'text' : ''},
{'text' : ''},
{'text' : ''},
{'text' : ''}
]
root = ET.fromstring(bytes_)
for count in range(0,len(root.findall("./entry"))):
for ele, xpath in enumerate(xpaths):
try:
attribs = list(root.findall(xpath)[count].attrib.keys())
for attrib in attribs:
for i in _fields[ele].keys():
if attrib == i:
_fields[ele][i] = root.findall(xpath)[count].attrib[attrib]
_fields[ele]["text"] =root.findall(xpath)[count].text
except IndexError:
_fields[ele]["text"]=''
data.append(_fields[ele].values())
data_list = [item for sublist in data for item in sublist]
data.clear()
print(data_list)
任何帮助都是值得赞赏的。
为清楚起见,进行了编辑
答:
-1赞
DisappointedByUnaccountableMod
6/3/2021
#1
您的 xpath 将匹配 HAIRCOLOR 标签,无论它在哪里,即任何地方。您需要首先找到每个条目,然后为每个条目查找 HAIRCOLOR 和条目中的其他标签。目前,您正在查找子标签。’./entry/HAIRCOLOR’
’./entry’
root
评论
0赞
PracticingPython
6/3/2021
谢谢你的建议。我最终通过您的评论意识到通过删除所有“/entry”来修改我的 xpath 列表。后来进行了其他一些小的修改以适应变化,一切都很好用。
评论