You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用Open API获取XML全量数据异常及转DataFrame问题

问题

使用Open API,通过serviceKey和Endpoint,携带mdsCd、numOfRows、pageNo参数请求全量item信息,请求URL格式为:Endpoint?serviceKey=Myservicekey&numOfRows=number&pageNo=num&mdsCd=itemcode。

现有代码(不含导入语句):

url="*endpoint*"
params={
'serviceKey':"",
'numOfRows':"",
'pageNo':"",
'mdsCd":"*aaa*"
}
response= requests.get(url,params=params)

soup = BeautifulSoup(response.content,'lxml-xml')
items = soup.find_all('item')

row = []
for item in items:
    row.append(item)

print(row)

已知API响应存在多个item(示例如下),但运行代码后仅能获取第一个item信息:

<item> <adtStaDd>20170201</adtStaDd> <chgBfMdsCd>E04420361</chgBfMdsCd> <gnlNmCd>388801BIJ</gnlNmCd> </item> <item> <adtStaDd>20191107</adtStaDd> <chgBfMdsCd>656800070</chgBfMdsCd> <gnlNmCd>237003ACH</gnlNmCd> </item>

疑问:

  • soup.find_all('item')是否能找到所有item?
  • 为何仅获取到一个item?
  • 如何获取全量item信息并转换为DataFrame?

解答

1. soup.find_all('item')的作用

soup.find_all('item')可以返回所有匹配的<item>标签,这个方法本身逻辑没问题,你只拿到一个item的问题大概率出在请求阶段,而非解析阶段。

2. 仅获取一个item的原因

常见问题点:

  • numOfRows参数未设置或值太小:如果这个参数留空或设为1,API只会返回1条数据,自然只能拿到一个item。
  • 仅请求了第一页数据:pageNo参数留空或固定为1时,API只返回第一页内容,若全量数据分布在多页,你就看不到后续的item。
  • API响应内容不符:可以先打印response.text查看返回的XML是否真的包含多个<item>标签,排除API返回本身的问题。

3. 获取全量item并转为DataFrame的实现

要拿到全量数据,需要处理分页逻辑,同时正确解析每个item的字段:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "*endpoint*"
params = {
    'serviceKey': "你的serviceKey",
    'numOfRows': "1000",  # 设为API允许的最大单页数量,减少请求次数
    'pageNo': 1,
    'mdsCd': "*aaa*"
}

all_items = []

while True:
    response = requests.get(url, params=params)
    soup = BeautifulSoup(response.content, 'lxml-xml')
    items = soup.find_all('item')
    
    # 如果当前页没有数据,终止循环
    if not items:
        break
    
    # 解析每个item的字段,转为字典
    for item in items:
        item_dict = {
            'adtStaDd': item.find('adtStaDd').text if item.find('adtStaDd') else None,
            'chgBfMdsCd': item.find('chgBfMdsCd').text if item.find('chgBfMdsCd') else None,
            'gnlNmCd': item.find('gnlNmCd').text if item.find('gnlNmCd') else None
        }
        all_items.append(item_dict)
    
    # 页码+1,请求下一页
    params['pageNo'] += 1

# 转换为DataFrame
df = pd.DataFrame(all_items)
print(df)

关键说明:

  • 设置合理的numOfRows:查看API文档,找到允许的最大单页返回数,减少分页请求次数。
  • 分页循环:通过递增pageNo,直到请求返回的<item>为空,说明已获取完所有数据。
  • 字段解析:将每个<item>下的子标签提取为字典,统一存入列表后,用pandas.DataFrame转换为表格格式。

内容的提问来源于stack exchange,提问作者ᄋᄉᄋ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:23:23