如何根据其索引使用 python etree 访问特定元素
How to access a specific element using python etree based on its index
我有一个看起来像这样的 xml 文件 :
<record>
<cf tag='id'>A1eF4GT</cf>
<df tag='123'>
<sf tag='a'>Foo</sf>
<sf> tag='u'>Bar</sf>
</df>
<df tag='123'>
<sf tag='a'>Truc</sf>
<sf tag='u'>Machin</sf>
</df>
</record>
我想用 Python Etree 解析它,我只是想得到“A1eF4GT;Foo/Bar;Truc/Machin”。到目前为止,我使用 findall 遍历 df tag='123',但我无法获得正确的对,我得到的只是“A1eF4GT;Foo/Bar;Truc/Bar”,因为“Bar”是我的代码在使用 'find' 时遇到的第一件事。我想有一些索引可以帮助我获得 df tag='123' 的位置,然后分配正确的值,但是我在代码处理的 documentation.The 部分找不到有用的东西看起来像这样:
for record in datafields:
id=record.find(".//cf[@tag='id']")
id=id.text.encode('utf8')
if record.findall("df[@tag='123']/sf[@code='a']"):
listequiv=[]
for equiv in record.findall("df[@tag='123']/sf[@code='a']"):
equiv=equiv.text
equiv2=record.find("df[@tag='123']/sf[@code='u']")
equiv2=equiv2.text
listequiv.append(equiv+'/'+equiv2)
stringequiv=';'.join(listequiv)
print ark+';'+stringequiv
我希望我说得足够清楚(抱歉我不是 IT 人...)
由于这是一个已知的树状结构,所以你必须先找到 df
条记录,然后在每条记录中找到 sf
条记录。
例如,df
条记录列表
>>> record.findall("df")
[<Element 'df' at 0x000001E32A942C20>, <Element 'df' at 0x000001E32A942D10>]
迭代示例:
>>> for elem in record.findall("df"):
... for sub_elem in elem.findall("sf"):
... print(sub_elem.text)
...
HALLO
Bar
Truc
Machin
您的示例(必须将编码降低到 utf-8
到 join
才能工作
>>> listequiv = []
>>> cf_text = record.find(".//cf[@tag='id']").text
>>> listequiv.append(cf_text)
>>>
>>> for elem in record.findall("df"):
... sf_elems = []
... for sub_elem in elem.findall("sf"):
... sf_elems.append(sub_elem.text)
... listequiv.append("/".join(sf_elems))
...
>>> print(";".join(listequiv))
A1eF4GT;Foo/Bar;Truc/Machin
我有一个看起来像这样的 xml 文件 :
<record>
<cf tag='id'>A1eF4GT</cf>
<df tag='123'>
<sf tag='a'>Foo</sf>
<sf> tag='u'>Bar</sf>
</df>
<df tag='123'>
<sf tag='a'>Truc</sf>
<sf tag='u'>Machin</sf>
</df>
</record>
我想用 Python Etree 解析它,我只是想得到“A1eF4GT;Foo/Bar;Truc/Machin”。到目前为止,我使用 findall 遍历 df tag='123',但我无法获得正确的对,我得到的只是“A1eF4GT;Foo/Bar;Truc/Bar”,因为“Bar”是我的代码在使用 'find' 时遇到的第一件事。我想有一些索引可以帮助我获得 df tag='123' 的位置,然后分配正确的值,但是我在代码处理的 documentation.The 部分找不到有用的东西看起来像这样:
for record in datafields:
id=record.find(".//cf[@tag='id']")
id=id.text.encode('utf8')
if record.findall("df[@tag='123']/sf[@code='a']"):
listequiv=[]
for equiv in record.findall("df[@tag='123']/sf[@code='a']"):
equiv=equiv.text
equiv2=record.find("df[@tag='123']/sf[@code='u']")
equiv2=equiv2.text
listequiv.append(equiv+'/'+equiv2)
stringequiv=';'.join(listequiv)
print ark+';'+stringequiv
我希望我说得足够清楚(抱歉我不是 IT 人...)
由于这是一个已知的树状结构,所以你必须先找到 df
条记录,然后在每条记录中找到 sf
条记录。
例如,df
条记录列表
>>> record.findall("df")
[<Element 'df' at 0x000001E32A942C20>, <Element 'df' at 0x000001E32A942D10>]
迭代示例:
>>> for elem in record.findall("df"):
... for sub_elem in elem.findall("sf"):
... print(sub_elem.text)
...
HALLO
Bar
Truc
Machin
您的示例(必须将编码降低到 utf-8
到 join
才能工作
>>> listequiv = []
>>> cf_text = record.find(".//cf[@tag='id']").text
>>> listequiv.append(cf_text)
>>>
>>> for elem in record.findall("df"):
... sf_elems = []
... for sub_elem in elem.findall("sf"):
... sf_elems.append(sub_elem.text)
... listequiv.append("/".join(sf_elems))
...
>>> print(";".join(listequiv))
A1eF4GT;Foo/Bar;Truc/Machin