Python ElementTree发现不起作用

时间:2017-03-13 19:30:59

标签: python elementtree

我是ElementTree的新手。我试图从XML响应中获取<sid>值。

以下代码对我不起作用。如何在<sid>中提取值?我不确定数字53来自何处。

    ...
    r = requests.post(self.dispatchurl, verify=False, auth=HTTPBasicAuth(self.user, self.passwd))
    print r.content
    tree = ET.ElementTree(r.content)
    print tree.find('sid')

输出:

/usr/bin/python2.7 /home/myuser/PycharmProjects/autoshun/shunlibs/SplunkSearch.py
<?xml version="1.0" encoding="UTF-8"?>
<response>
  <sid>super__awesome__search__searchname_at_1489433276_24700</sid>
</response>

53

Process finished with exit code 0

3 个答案:

答案 0 :(得分:1)

以下代码对我有用:

    r = requests.post(self.dispatchurl, verify=False, auth=HTTPBasicAuth(self.user, self.passwd), stream=True)
    root = ET.fromstring(r.content)
    for i in root.iter('response'):
        print i.find('sid').text

答案 1 :(得分:0)

作为替代方案,您可以使用xpath。

>>> import xml.etree.ElementTree as ET
>>> xml = '''\
... <?xml version="1.0" encoding="UTF-8"?>
... <response>
...     <sid>super__awesome__search__searchname_at_1489433276_24700</sid>
... </response>
... '''
>>> root = ET.fromstring(xml)
>>> for sid in root.iterfind('.//sid'):
...     sid.text
... 
'super__awesome__search__searchname_at_1489433276_24700'
>>> 

答案 2 :(得分:0)

我知道OP已经快2岁了,但是我遇到了同样的问题,并找到了适合我的解决方案。有效的方法是在加载XML文件的解析调用之后立即删除名称空间。

像这样的功能:

def remove_namespace(xmldoc, namespace):
ns = u'{%s}' % namespace
nsl = len(ns)
for elem in xmldoc.getiterator():
    if elem.tag.startswith(ns):
        elem.tag = elem.tag[nsl:]

我发现ElementTree的命名空间存在问题,您可以使用上述函数将其删除,或者必须将显式命名空间传递给find或findall函数。