使用 ElementTree 解析 XML API 结果
Parsing XML API Result Using ElementTree
我正在使用 Element Tree 来解析 API 调用的以下结果。
<response status="success" code="19">
<result total-count="1" count="1">
<users>
<entry name="admin">
<phash>$$$$$</phash>
<permissions>
<role-based>
<superuser>yes</superuser>
</role-based>
</permissions>
</entry>
<entry name="tester">
<permissions>
<role-based>
<superuser>yes</superuser>
</role-based>
</permissions>
<phash>$$$$$</phash>
</entry>
</users>
</result>
我只想打印作为条目属性的用户名。我正在使用以下代码来解析它。
def BP01002(ip, apikey):
xpath = "/config/mgt-config/users"
rulequery = {'type': 'config', 'action': 'get', 'key': apikey, 'xpath': xpath}
rrule = requests.get('https://' + ip + '/api', params = rulequery, verify=False)
rresp = ET.fromstring(rrule.text)
user = rresp.findall("./result/users")
print user
如果我只执行打印用户,我会得到以下响应,这是我所期望的。
[<Element entry at 6ffff0948c0>, <Element entry at 6ffff094a28>]
如果我尝试使用 user.text 或 user.attrib 打印结果文本,我会收到以下错误。
AttributeError: 'list' object has no attribute 'text'
如何只提取条目名称文本数据?
查找所有 returns 列表。如果你想打印 element.text,你需要像
这样的东西
[u.text for u in rresp.findall('users')]
但是,这只会在 <users>
之后打印换行符。
我怀疑,您可能想要的是
>>> [e.attrib for e in rresp.findall('users/entry')]
[{'name': 'admin'}, {'name': 'tester'}]
为了完整起见,element.text return 是文本节点元素的开始和结束标签内的文本,例如
<element>sometext</element>
或"sometext"。如果您的元素不是文本节点,它将 return 换行符或元素和下一个节点之间的任何内容。
<element>
<child>
</child>
</element>
在上面的示例中,对于节点子节点或元素,文本将 return 一个换行符。
我正在使用 Element Tree 来解析 API 调用的以下结果。
<response status="success" code="19">
<result total-count="1" count="1">
<users>
<entry name="admin">
<phash>$$$$$</phash>
<permissions>
<role-based>
<superuser>yes</superuser>
</role-based>
</permissions>
</entry>
<entry name="tester">
<permissions>
<role-based>
<superuser>yes</superuser>
</role-based>
</permissions>
<phash>$$$$$</phash>
</entry>
</users>
</result>
我只想打印作为条目属性的用户名。我正在使用以下代码来解析它。
def BP01002(ip, apikey):
xpath = "/config/mgt-config/users"
rulequery = {'type': 'config', 'action': 'get', 'key': apikey, 'xpath': xpath}
rrule = requests.get('https://' + ip + '/api', params = rulequery, verify=False)
rresp = ET.fromstring(rrule.text)
user = rresp.findall("./result/users")
print user
如果我只执行打印用户,我会得到以下响应,这是我所期望的。
[<Element entry at 6ffff0948c0>, <Element entry at 6ffff094a28>]
如果我尝试使用 user.text 或 user.attrib 打印结果文本,我会收到以下错误。
AttributeError: 'list' object has no attribute 'text'
如何只提取条目名称文本数据?
查找所有 returns 列表。如果你想打印 element.text,你需要像
这样的东西[u.text for u in rresp.findall('users')]
但是,这只会在 <users>
之后打印换行符。
我怀疑,您可能想要的是
>>> [e.attrib for e in rresp.findall('users/entry')]
[{'name': 'admin'}, {'name': 'tester'}]
为了完整起见,element.text return 是文本节点元素的开始和结束标签内的文本,例如
<element>sometext</element>
或"sometext"。如果您的元素不是文本节点,它将 return 换行符或元素和下一个节点之间的任何内容。
<element>
<child>
</child>
</element>
在上面的示例中,对于节点子节点或元素,文本将 return 一个换行符。