请求后获取来自GitHub URL的一批数据。

时间:2019-01-05 13:14:57

标签: python iteration github-api

考虑到每次对read()的调用都将返回一部分数据,我试图一一解析URL。我有一个所有者(GitHub帐户),一个或多个存储库以及一个或多个资源(问题,提交等)。当用户调用read()时,该类必须迭代每个存储库和资源的组合 多次。问题在于,它不会遍历所有者,存储库和资源之间的每个组合。到目前为止,这是我的代码:

import requests

class GitHub():

    def __init__(self, owner, repositories, resources):
        self.owner = owner
        self.repositories = repositories
        self.resources = resources

    def read(self):
        for rep in self.repositories:
            for res in self.resources:
                url = 'https://api.github.com/repos/{}/{}/{}'.format(self.owner, rep, res)
                result = requests.get(url)
                if result.status_code == 200:
                    json_res = result.json()
                    return json_res
                else:
                    print(result.text)
                    print(result.status_code)

gh = GitHub('example', ['example1', 'example2'], ['issues','pulls'])
data = gh.read()

更新

class GitHub():

    def __init__(self, owner, repositories, resources):
        self.owner = owner
        self.repositories = repositories
        self.resources = resources

    def create_list(self):
        for rep in self.repositories:
            for res in self.resources:
                url = 'https://api.github.com/repos/{}/{}/{}'.format(self.owner, rep, res)
                result = requests.get(url)
                if result.status_code == 200:
                    json_res = result.json()
                    print(json_res)
                else:
                    print(result.text)
                    print(result.status_code)
                    break
                yield

gh = GitHub('moby', ['moby', 'buildkit'], ['issues','pulls'])
data = gh.create_list()
while data is not None:
    try:
        next(data)
        data = gh.create_list()
    except StopIteration:
        break

我只是设法得到了这种形式的代码。现在,当我尝试执行代码时,它会在相同的URL(.../moby/moby/issues)上进行迭代,而不会从self.resources中获取下一个值(在create_list方法中)。我在哪里错了?

1 个答案:

答案 0 :(得分:0)

我看到您正在使用yield,因此您尝试创建一个generator,该列表允许您一次迭代一个项目。但是有两个问题:

  1. yield没有产生任何价值
  2. 您正在调用create_list(),好像它一次产生了所有元素一样。

以下,我更改了yield来生成一个字典,其中包含当前项目的网址和结果。然后,我用for遍历值,打印出每个项目的url和从GitHub返回的结果中的元素数:

import requests

class GitHub():

    def __init__(self, owner, repositories, resources):
        self.owner = owner
        self.repositories = repositories
        self.resources = resources

    def create_list(self):
        for rep in self.repositories:
            for res in self.resources:
                url = 'https://api.github.com/repos/{}/{}/{}'.format(self.owner, rep, res)
                result = requests.get(url)
                if result.status_code == 200:
                    yield {'url': url, 'result': result.json()}

gh = GitHub('moby', ['moby', 'buildkit'], ['issues','pulls'])
for result in gh.create_list():
    print('url: {}\tlen(result): {}'.format(result['url'], len(result['result'])))

输出:

url: https://api.github.com/repos/moby/moby/issues      len(result): 30
url: https://api.github.com/repos/moby/moby/pulls       len(result): 30
url: https://api.github.com/repos/moby/buildkit/issues  len(result): 30
url: https://api.github.com/repos/moby/buildkit/pulls   len(result): 8