我正在尝试使用python从一个API解析一些json。结果被分页成100个一组,json中有一个NextPageLink
条目链接到下一页。
我有一个类,它有一个解析器,当遇到NextPageLink
时,它应该在新的响应上调用自己,但它似乎不起作用。
有人能解释一下为什么吗?
import requests
from requests.exceptions import HTTPError
class MyParser():
def __init__(self):
try:
self.response = requests.get("API end point url")
except HTTPError as http_err:
print("HTTP Error")
except:
print("Other Error")
def parse(self):
print("Called outer")
for item in self.response.json()["Items"]:
yield {
item["Thing"]:item["Entry"]
}
next_page = self.response.json()["NextPageLink"]
if next_page is not None:
self.response=requests.get(next_page)
print("about to call again")
self.parse()
print("Called")
似乎不起作用。我从:
test = MyParser()
for i in test.parse():
print(i)
输出量
Called outer
list of things yielded
about to call again
Called
1条答案
按热度按时间ecbunoof1#
根据这个What does the "yield" keyword do?
for函数第一次调用从你的函数中创建的生成器对象时,它会从头开始运行你的函数中的代码,直到它到达yield,然后它会返回循环的第一个值。然后,每一次后续调用都会运行你在函数中编写的循环的另一次迭代,并返回下一个值。这将一直持续到生成器被认为是空的。这可能是因为循环已经结束,或者是因为你不再满足“if/else”。
我认为这意味着当你使用yield关键字时,函数将返回一个生成器。如果你使用生成器,它将搜索关键字yield,并尝试运行代码,直到找到其中一个yield。由于在解析函数的下半部分没有“yield”,for循环将简单地停止。
我尝试生成self.parse()的调用,但它只是输出生成器对象,如“〈generator object xxx at 0x 7 f3 afa 5287 d 0〉”
我还没有测试过,但是你可能可以使用while循环: