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,提问作者ᄋᄉᄋ
相关产品推荐
相关产品推荐

