[英]Populating Python list using data obtained from lxml xpath command
我正在从以xml格式提供信息的专业服务器中读取仪器数据。 我写的代码是:从lxml导入etree作为ET
xmlDoc = ET.parse('http://192.168.1.198/Bench_read.xml')
print ET.tostring(xmlDoc, pretty_print=True)
dmtCount = xmlDoc.xpath('//dmt')
print(len(dmtCount))
dmtVal = []
for i in range(1, len(dmtCount)):
dmtVal[i:0] = xmlDoc.xpath('./address/text()')
dmtVal[i:1] = xmlDoc.xpath('./status/text()')
dmtVal[i:2] = xmlDoc.xpath('./flow/text()')
dmtVal[i:3] = xmlDoc.xpath('./dp/text()')
dmtVal[i:4] = xmlDoc.xpath('./inPressure/text()')
dmtVal[i:5] = xmlDoc.xpath('./actVal/text()')
dmtVal[i:6] = xmlDoc.xpath('./temp/text()')
dmtVal[i:7] = xmlDoc.xpath('./valveOnPercent/text()')
print dmtVal
我得到的结果是:
$python XMLparse2.py
<response>
<heartbeat>0x24</heartbeat>
<dmt node="1">
<address>0x21</address>
<status>0x01</status>
<flow>0.000000</flow>
<dp>0.000000</dp>
<inPressure>0.000000</inPressure>
<actVal>0.000000</actVal>
<temp>0x00</temp>
<valveOnPercent>0x00</valveOnPercent>
</dmt>
<dmt node="2">
<address>0x32</address>
<status>0x01</status>
<flow>0.000000</flow>
<dp>0.000000</dp>
<inPressure>0.000000</inPressure>
<actVal>0.000000</actVal>
<temp>0x00</temp>
<valveOnPercent>0x00</valveOnPercent>
</dmt>
</response>
...Starting to parse XML nodes
2
[]
...Done
太好了,什么都没出来。 我尝试在xpath调用中使用/value
代替/text()
,但是结果没有改变。 是我的问题:
1)for循环中的xpath命令不正确? 要么
2)我构造列表变量dmtVal
的方式有问题吗? 要么
3)我完全想念的其他东西吗?
我欢迎任何建议! 提前致谢...
dmtVal[i:0]
是切片的语法。
您可能想要索引: dmtVal[i][0]
。 但这也行不通。
通常,您不需要在python中循环遍历列表的索引,而是可以遍历它的元素。
所以,你会用
for element in some_list:
而不是
for i in xrange(len(some_list)):
element = some_list[i]
处理xpath的方式也是错误的。
这样的事情应该可以工作(未经测试):
from lxml import etree as ET
xml_doc = ET.parse('http://192.168.1.198/Bench_read.xml')
dmts = xml_doc.xpath('//dmt')
dmt_val = []
for dmt in dmts:
values = []
values.append(dmt.xpath('./address/text()'))
# do this for all values
# making this a loop would be a good idea
dmt_val.append(values)
print dmt_val
您能解释一下:
dmtVal[i:0]
如果迭代以0
计数开始并随时间递增,则实际上并没有在列表中存储任何内容。
计算<dmt/>
标记,然后按索引对其进行迭代既低效又不符合Python规范。 除此之外,您使用错误的语法(切片而不是索引)来索引数组。 实际上,您根本不需要索引val
,以Python的方式使用列表推导即可完成。
这是stranac建议的稍作修改的版本:
from lxml import etree as ET
xmlDoc = ET.parse('http://192.168.1.198/Bench_read.xml')
print ET.tostring(xmlDoc, pretty_print=True)
response = xmlDoc.getroot()
tags = (
'address',
'status',
'flow',
'dp',
'inPressure',
'actVal',
'temp',
'valveOnPercent',
)
dmtVal = []
for dmt in response.iter('dmt'):
val = [dmt.xpath('./%s/text()' % tag) for tag in tags]
dmtVal.append(val)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.