scrapy python函数中的递归调用

ff29svar  于 2022-11-09  发布在  Python
关注(0)|答案(1)|浏览(201)

我正在尝试使用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
ecbunoof

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循环:

def parse(self):
    print("Called outer")
    items = self.response.json()["Items"]
    while items:
        if not items:
            break
        for item in items:
            yield {
                item["Thing"]: item["Entry"]
            }

        link = self.response.json()["NextPageLink"]
        resp = requests.get(link)
        items = resp.json()['Items']

相关问题