API分页XML解析:如何获取单个连续XML页面?
解决方案:合并分页返回的独立XML节点
没问题,这种API分页返回多个独立根节点XML的情况很常见,我们可以通过手动合并节点的方式生成一个连续的完整XML文档。以下是具体的实现思路和代码调整方案:
核心思路
创建一个统一的<interactions>主根节点,每次请求分页数据后,将返回结果里的所有<interaction>子节点提取出来,追加到这个主根节点中。循环结束后,这个主根节点就包含了所有分页的交互数据,最后再将其转换为完整的XML字符串即可。
调整后的代码示例
import datetime import requests import xml.etree.ElementTree as et # 初始化日期参数 dt = datetime.datetime.today() - datetime.timedelta(days=1) dt_str = dt.strftime('%Y%m%d') # 创建主根节点 main_root = et.Element("interactions") n = 0 # 分页起始偏移量,初始为0(根据API实际规则调整,有些API从1开始) while True: # 发送分页请求 url = f'https://APIURL/api/stats/allinteractions?d=20190101,{dt_str}&n={n}' response = requests.get(url, auth=('user', 'pass')) # 确保请求成功,避免无效数据混入 response.raise_for_status() # 解析当前分页的XML page_root = et.fromstring(response.content) # 获取当前页的<interaction>节点数量 interaction_count = len(page_root.findall('interaction')) # 将当前页的所有<interaction>节点追加到主根节点 for interaction in page_root.findall('interaction'): main_root.append(interaction) # 判断是否继续循环:如果当前页返回了50条(API每页上限),则继续请求下一页 if interaction_count < 50: break n += 50 # 生成完整的XML字符串(可选:保存到文件或进一步处理) full_xml = et.tostring(main_root, encoding='utf-8', xml_declaration=True) # 如果需要格式化输出,可以使用第三方库优化格式 # import xml.dom.minidom # dom = xml.dom.minidom.parseString(full_xml) # pretty_xml = dom.toprettyxml(indent=' ') # print(pretty_xml)
关键细节说明
- 分页偏移量适配:我假设API的
n参数是起始偏移量(比如n=0返回前50条,n=50返回第51-100条),如果你的APIn参数是页码,需要调整初始值和递增逻辑。 - 异常防护:添加了
response.raise_for_status(),确保请求失败时直接抛出异常,避免无效的空数据或错误数据被合并。 - 节点合并逻辑:通过
page_root.findall('interaction')精准提取当前页的交互节点,再用main_root.append()将它们挂载到主根节点下,最终形成一个结构完整的连续XML文档。 - 循环终止条件:当某一页返回的
<interaction>数量小于50时,说明已经获取到最后一页数据,直接终止循环即可。
内容的提问来源于stack exchange,提问作者Jamm6
相关产品推荐
相关产品推荐

