如何从POST请求接收的XML中正确检索数据

时间:2019-02-21 14:41:37

标签: python python-3.x post xml-parsing python-requests

因此,我正在编写Python脚本,以便从XML获取数据,这些数据是我对使用POSTrequests库发送的API请求的响应。

目前,我正在像这样使用我的请求,并得到如下回复:

req = requests.post(url + '/endpoint', headers = headers, params = {'search': searchQuery}, verify = False)
print(req.text)

这导致req.text向我发送我的XML,该XML的结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/static/atom.xsl"?>
<feed>
    <!-- Feed elements>
    <entry>
        <!-- Other Elements -->
        <content type="text/xml">
            <s:dict>
                <!-- Other keys. -->
                <s:key name="sid">DATA I WANT HERE</s:key>
                <!-- Other keys. -->
            </s:dict>
            <!-- Lots of other dicts here. -->
        </content>
    </entry>
    <! -- Other entries -->
</feed>

我的目标是从s:keyname的{​​{1}}获取所有数据,并打印出来。每个提要有数百个条目,每个提要中只有一个sid,其中包含s:key(这是我需要获得的服务标识符)。

我的问题是我不确定如何提取它,因为现在我正尝试像这样使用Element Tree,但是它没有返回我想要的结果。

sid

我也尝试过:

print(req.text)
results = ET.fromstring(req)
for job in results.findall('s:key'):
    print(job.get('name'))

这也没有给我我想要的信息。

我在做什么错,如何解决?我有点不熟悉Python,并且对XML解析非常陌生,因此希望对这个问题有一些见识。

附录:

要添加的内容是,目前看来,它只是打印出我不想要的所有带有for node in results.findall('s:key'): if node.attrib['name'] == "sid": print(node) 和属性s:key的XML行。

例如,当前示例输出为:

name

1 个答案:

答案 0 :(得分:1)

一种可能的方法是使用Regex:

使用正则表达式,您将找到组,例如Regex

>>> import re
>>> m = re.search(r'\<s\:\S+\sname=\"sid\"\>(.+)\<.+', string, re.MULTILINE)
>>> print(m.groups())
('DATA I WANT HERE',)