【问题标题】:How to correctly retrieve data from XML received from POST request如何从从 POST 请求收到的 XML 中正确检索数据
【发布时间】:2019-07-15 12:29:36
【问题描述】:

所以我正在编写一个 Python 脚本,以便从 XML 中获取数据,以响应使用 POSTrequests 库发送的 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>

我的目标是从namesids:key 中获取所有数据并将其打印出来。每个提要有数百个条目,每个提要中只有一个 s:keysid(这是我需要获取的服务标识符)。

我的问题是我不确定如何提取它,因为现在我正尝试像这样使用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:keyname 属性的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 -->

【问题讨论】:

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


【解决方案1】:

一种可能的方法是使用正则表达式:

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

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

【讨论】:

  • 虽然这行得通,但我只得到了第一个数据集。即它不返回任何其他匹配项,即使当我转储到文件和CTRL+F 时,我至少可以看到 500 个匹配结果。
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 2011-08-03
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多