所以我正在编写一个Python脚本,以便从XML中获取数据,这是我为响应使用POST
和requests
库发送的API请求而获得的。
目前我正在使用我的请求,并得到如下回复:
req = requests.post(url + '/endpoint', headers = headers, params = {'search': searchQuery}, verify = False)
print(req.text)
这导致req.text
向我回复我的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:key
的name
获取sid
的所有数据并打印出来。每个Feed有数百个条目,每个条目中只有一个s:key
,其中包含sid
(这是我需要获取的服务标识符)。
我的问题是我不知道如何提取它,因为我现在正试图像这样使用Element Tree,但它并没有返回我想要的结果。
print(req.text)
results = ET.fromstring(req)
for job in results.findall('s:key'):
print(job.get('name'))
我也尝试过:
for node in results.findall('s:key'):
if node.attrib['name'] == "sid":
print(node)
这也没有给我我想要的信息。
我做错了什么,我该如何解决?我对Python有点不熟悉,也不熟悉XML解析,所以我很欣赏这个问题的一些见解。
附录:
要添加,目前似乎只打印出s:key
和name
属性的所有XML行,我不想要它们。
例如,此刻的示例输出是:
<s:key name="a">74993868</s:key>
<s:key name="b">0</s:key>
<s:key name="c">date</s:key>
<s:key name="d">6000</s:key>
<s:key name="e">600</s:key>
<s:key name="f">text</s:key>
<s:key name="sid">data I actually want</s:key>
<!-- Etc -->
一种可能的方法是使用正则表达式:
使用正则表达式,你会发现这些组,如Regex。
>>> import re
>>> m = re.search(r'\<s\:\S+\sname=\"sid\"\>(.+)\<.+', string, re.MULTILINE)
>>> print(m.groups())
('DATA I WANT HERE',)