如何在next_page为None时终止循环并解决字符串拼接类型错误?
解决API分页循环中的None拼接错误
嘿,我看到你在处理API分页收集请求URL的时候遇到了TypeError问题,咱们一步步来理清问题根源,然后搞定它!
问题出在哪?
首先,你碰到的TypeError: can only concatenate str (not "NoneType") to str,是因为当API返回的next_page是Python的None类型(不是字符串'None')时,你直接把它和基础URL拼接了,而None没法和字符串拼接。
另外你的循环和判断逻辑也有小问题:
- 循环条件用了
or:while hypermedia_np is not None or hypermedia_np != 'None',这意味着只要其中一个条件成立,循环就会继续。比如当hypermedia_np是None时,hypermedia_np != 'None'是True,循环会一直跑下去,这时候去拼接就直接报错了。 - 你的判断只检查了
next_page != 'None',但没处理next_page是None的情况,所以当API返回的是null(对应Python的None)时,这个判断拦不住,还是会去拼接。
修复后的完整代码
import requests # 别忘了导入requests库,原代码里没写这行哦 pages = [] # 替换成你实际的headers和params headers = {"Authorization": "your-token-here"} params = {"some-param": "value"} def build_requests(request): base_url = 'https://api.performancehorizon.com' # 处理初始请求 full_initial_url = base_url + request response = requests.get(full_initial_url, headers=headers, params=params) response_data = response.json() pages.append(full_initial_url) # 获取第一页的next_page,统一处理成Python的None(不管API返回的是null还是字符串'None') next_page = response_data['hypermedia']['pagination']['next_page'] if next_page == 'None': next_page = None # 循环:只有当next_page存在(不是None)时,才继续请求下一页 while next_page is not None: # 这里已经确认next_page不是None,拼接不会报错 full_next_url = base_url + next_page pages.append(full_next_url) # 请求下一页数据 response = requests.get(full_next_url, headers=headers, params=params) response_data = response.json() # 更新next_page,同样处理字符串'None'的情况 next_page = response_data['hypermedia']['pagination']['next_page'] if next_page == 'None': next_page = None # 调用函数,传入你的初始请求路径,比如'/some/initial/path' build_requests('/your-initial-request-path') print("Done!")
关键改进说明
- 统一处理"无下一页"的情况:把API可能返回的两种"无"(Python的None和字符串'None')统一转换成Python的None,这样只需要一个判断条件就能搞定,不用来回区分。
- 修正循环逻辑:直接用
while next_page is not None,逻辑简单清晰——只要有下一页的有效路径,就继续循环;没有就终止。 - 提前确保拼接安全:在拼接URL之前,已经确认
next_page不是None,彻底避免了TypeError。 - 代码简化:去掉了冗余的
hypermedia_np变量,直接用next_page跟踪下一页路径,读起来更顺畅。
额外小建议
- 可以加个异常处理,比如捕获请求失败的情况(比如
requests.exceptions.RequestException),避免程序突然崩溃。 - 如果API有时候会返回空字符串作为
next_page,可以在判断里加上and next_page.strip() != '',根据实际的API返回调整就行。
内容的提问来源于stack exchange,提问作者Ben P
相关产品推荐
相关产品推荐

