【问题标题】:Using Python requests to consume API that streams XML data使用 Python 请求来使用流 XML 数据的 API
【发布时间】:2021-06-19 09:36:20
【问题描述】:

我对编程很陌生,但已经获得了一些经验。现在,我正试图从返回流式 XML 数据的 API 中消费数据,当事件发生时,API 将流式传输完整的 <event></event> 元素,请参见下面的示例。

如果没有事件发生,API 还会每 30 秒发送一次<hearbeat></heartbeat> 事件。

import requests
from requests.auth import HTTPBasicAuth

r = requests.get(url2, auth=auth, verify=False, stream=True)
for line in r.iter_lines():
    if line:
        dec = line.decode("utf-8")
        print(f"line: {dec}")
Output:

line: <event id="4311" name="ExtractME" type="log" timestamp="1616433400000">
line: <argument value="cu" type="log" id="1"/>
line: <argument value="ExtractMe" type="dc" id="1" logid="516798654936147>
line: </argument>
line: <argument value="" type="dc" id="1"/>
line: </event>

在此处的事件日志中,我已将要获取的数据的值更改为 ExtractMe。有什么想法吗?

我正在使用这个例子; https://requests.readthedocs.io/en/master/user/advanced/#streaming-requests

【问题讨论】:

  • 欢迎来到 Stack Overflow。你的问题是什么?有什么不工作吗?
  • 您好,谢谢!是的,我如何将我用 ExtractMe 替换的值放入单个字典中,然后将该字典发送到我的应用程序的其余部分?由于事件在一行中出现,我正在努力解决如何提取它
  • 您使用Python's XML-handling abilities 将XML 解析为数据结构。
  • 是的,我将它用于项目的其他部分。但在这种情况下,我从 API 获取事件日志 - 并且 API 正在流式传输。每次发生事件时,我都会在上面的示例中得到响应,并在 request.iter_lines() 中逐行获取它,问题是我不明白如何将其转换为 python 可以使用 xml.etree 或其他东西处理的东西。当 API 流式传输事件时,我认为我没有得到完整的 XML 数据结构
  • 我没有为每个事件创建一个新请求,我连接到 API 一次,它会在事件发生时发送连续的数据流,如上例所示

标签: python xml api python-requests streaming


【解决方案1】:

您收到的流由不同的 XML 文档组成,每个文档都有自己的根元素 &lt;event&gt;。因此,流作为一个整体本身并不是一个有效的 XML 文档,因为它有多个根,并且不能被任何 XML 解析器解析。

处理这个问题的唯一方法是在内存中缓冲整个事件,然后自己解析每个事件。

【讨论】:

    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2015-11-15
    • 2020-01-05
    相关资源
    最近更新 更多