在列表中打印 'element1' 返回 <Element 'element1' at 0x0000013C6D4B9270>
Print 'element1' in list returms an <Element 'element1' at 0x0000013C6D4B9270>
我最近开始学习 python,我的代码有问题。
我正在尝试使用具有以下形式的 elementtree 解析 xml:
<UNHEATED_ROWS>6</UNHEATED_ROWS>
<UNHEATED1 rid="1">
</UNHEATED1>
<UNHEATED2 rid="1">
</UNHEATED2>
<UNHEATED3 rid="1">
</UNHEATED3>
<UNHEATED4 rid="1">
</UNHEATED4>
<UNHEATED5 rid="1">
</UNHEATED5>
<UNHEATED6 rid="1">
有了这个:
for i in range root.iter('UNHEATED_ROWS'):
uheatedzones = UNHEATED_ROWS.text
for j in range uheatedzones:
uzones.append("UNHEATED" + str(j+1)):
for k in range(int(uheatedzones)):
for uzones[k] in root.iter("UNHEATED%s" % (k+1)):
print(uzones[k])
而不是 UNHEATED1,UNHEATED2... 我希望打印出来的是我得到的
<0x0000017263D28220 处的元素 'UNHEATED1'>
我的代码有什么问题?
谢谢
要获取 单个 元素的文本,请不要使用任何循环。
而是使用:
root.findtext('UNHEATED_ROWS')
但是请注意,returned 值是 字符串,而不是整数。
您代码中的另一个缺陷是 str(j+1)
。
第一个错误是j是Element的对象class
并且它转换为字符串不会 return 它的文本。
第二个错误是 j+1
,即您试图将 1 添加到此对象。
要正确处理每个 UNHEATED… 元素,您可以例如使用 root.iter()
(不带参数)并在循环中检查标签名称是否以
"UNHEATED" 然后它包含一个数字(省略 UNHEATED_ROWS 元素)。
您必须导入 re 模块。
如果你想访问一个元素的attributes,使用attrib方法
一个元素,它 return 是一个字典 ({attr_name: attr_value}).
所以示例循环可以是:
i = 0
for it in root.iter():
if re.match(r'UNHEATED\d', it.tag):
i += 1
print(f'{i}: {it.tag}: {it.attrib["rid"]}')
对于你的来源 XML 它打印:
1: UNHEATED1: 1
2: UNHEATED2: 1
3: UNHEATED3: 1
4: UNHEATED4: 1
5: UNHEATED5: 1
6: UNHEATED6: 1
另请注意,我没有在上面的循环中使用 it.text
,因为每个
UNHEATED… 元素没有文本,在这种情况下 text 方法 returns
None.
感谢您的回答。
<UNHEATED1 rid="1">
<un_parameter1>82.8</un_parameter1>
<un_parameter2>123.3720</un_parameter2>
<ENVELOPE rid="1">
<opaque_rows>17</opaque_rows>
<transparent_column5>0.600,2.200,0.600,</transparent_column5>
<transparent_column6>Α1,Α2,Α10,</transparent_column6>
>
</ENVELOPE>
</UNHEATED1>
每个 UNHEATED 都有相似的结构,我想访问所有 UNHEATED,这就是我使用循环的原因
我最近开始学习 python,我的代码有问题。 我正在尝试使用具有以下形式的 elementtree 解析 xml:
<UNHEATED_ROWS>6</UNHEATED_ROWS>
<UNHEATED1 rid="1">
</UNHEATED1>
<UNHEATED2 rid="1">
</UNHEATED2>
<UNHEATED3 rid="1">
</UNHEATED3>
<UNHEATED4 rid="1">
</UNHEATED4>
<UNHEATED5 rid="1">
</UNHEATED5>
<UNHEATED6 rid="1">
有了这个:
for i in range root.iter('UNHEATED_ROWS'):
uheatedzones = UNHEATED_ROWS.text
for j in range uheatedzones:
uzones.append("UNHEATED" + str(j+1)):
for k in range(int(uheatedzones)):
for uzones[k] in root.iter("UNHEATED%s" % (k+1)):
print(uzones[k])
而不是 UNHEATED1,UNHEATED2... 我希望打印出来的是我得到的 <0x0000017263D28220 处的元素 'UNHEATED1'>
我的代码有什么问题? 谢谢
要获取 单个 元素的文本,请不要使用任何循环。 而是使用:
root.findtext('UNHEATED_ROWS')
但是请注意,returned 值是 字符串,而不是整数。
您代码中的另一个缺陷是 str(j+1)
。
第一个错误是j是Element的对象class 并且它转换为字符串不会 return 它的文本。
第二个错误是 j+1
,即您试图将 1 添加到此对象。
要正确处理每个 UNHEATED… 元素,您可以例如使用 root.iter() (不带参数)并在循环中检查标签名称是否以 "UNHEATED" 然后它包含一个数字(省略 UNHEATED_ROWS 元素)。 您必须导入 re 模块。
如果你想访问一个元素的attributes,使用attrib方法 一个元素,它 return 是一个字典 ({attr_name: attr_value}).
所以示例循环可以是:
i = 0
for it in root.iter():
if re.match(r'UNHEATED\d', it.tag):
i += 1
print(f'{i}: {it.tag}: {it.attrib["rid"]}')
对于你的来源 XML 它打印:
1: UNHEATED1: 1
2: UNHEATED2: 1
3: UNHEATED3: 1
4: UNHEATED4: 1
5: UNHEATED5: 1
6: UNHEATED6: 1
另请注意,我没有在上面的循环中使用 it.text
,因为每个
UNHEATED… 元素没有文本,在这种情况下 text 方法 returns
None.
感谢您的回答。
<UNHEATED1 rid="1">
<un_parameter1>82.8</un_parameter1>
<un_parameter2>123.3720</un_parameter2>
<ENVELOPE rid="1">
<opaque_rows>17</opaque_rows>
<transparent_column5>0.600,2.200,0.600,</transparent_column5>
<transparent_column6>Α1,Α2,Α10,</transparent_column6>
>
</ENVELOPE>
</UNHEATED1>
每个 UNHEATED 都有相似的结构,我想访问所有 UNHEATED,这就是我使用循环的原因