【问题标题】:Print JSON data from csv list of multiple urls从多个 url 的 csv 列表中打印 JSON 数据
【发布时间】:2017-12-10 16:57:45
【问题描述】:

对 Python 非常陌生,还没有找到关于 SO 的具体答案,但如果这看起来很幼稚或已经在其他地方出现,请提前道歉。

我正在尝试从公共数据集的多个 url 打印“IncorporationDate”JSON 数据。我将网址保存为 csv 文件,下面是 sn-p。我只是从一个 url 打印所有 JSON 数据,我不确定如何在所有 csv url 上运行它,并只将 IncorporationDate 值写入 csv。

非常欢迎任何基本指导或编辑!

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json


def get_jsonparsed_data(url):

    response = urlopen(url)
    data = response.read().decode("utf-8")
    return json.loads(data)


url = ("http://data.companieshouse.gov.uk/doc/company/01046514.json")
print(get_jsonparsed_data(url))

import csv
with open('test.csv') as f:
    lis=[line.split() for line in f]
    for i,x in enumerate(lis):              
        print ()

import StringIO
s = StringIO.StringIO()
with open('example.csv', 'w') as f:
    for line in s:
        f.write(line)

csv 片段:

http://business.data.gov.uk/id/company/01046514.json
http://business.data.gov.uk/id/company/01751318.json
http://business.data.gov.uk/id/company/03164710.json
http://business.data.gov.uk/id/company/04403406.json
http://business.data.gov.uk/id/company/04405987.json

【问题讨论】:

    标签: python json csv url


    【解决方案1】:

    欢迎来到 Python 世界。

    • 为了处理 http 请求,我们通常使用requests,因为它是非常简单的 api。

    下面的代码 sn-p 可以满足您的要求:

    1. 它从您发布的每个网址中获取数据
    2. 它使用每个 IncorporationDate 键创建一个新的 CSV 文件。

    ```

    import csv
    import requests
    
    COMPANY_URLS = [
        'http://business.data.gov.uk/id/company/01046514.json',
        'http://business.data.gov.uk/id/company/01751318.json',
        'http://business.data.gov.uk/id/company/03164710.json',
        'http://business.data.gov.uk/id/company/04403406.json',
        'http://business.data.gov.uk/id/company/04405987.json',
    ]
    
    def get_company_data():
        for url in COMPANY_URLS:
            res = requests.get(url)
            if res.status_code == 200:
                 yield res.json()
    
    if __name__ == '__main__':
        for data in get_company_data():
            try:
                incorporation_date = data['primaryTopic']['IncorporationDate']
            except KeyError:
                continue
            else:
                with open('out.csv', 'a') as csvfile:
                    writer = csv.writer(csvfile)
                    writer.writerow([incorporation_date])
    

    ```

    【讨论】:

    • 非常感谢,这确实可以完成这项工作。我将通过 100 或 1000 个 url 运行它,这可能会产生问题,但我会看看它是如何进行的。
    • 如果说其中一个网址缺少“IncorporationDate”信息,有没有办法跳过它?我不断收到 KeyError: 'IncorporationDate' after 30 secs-1min 左右,我认为这可能是由于缺少信息..? @seanparsons
    • @Oliverater 我更新了代码以反映通过从 HTTP 请求获取数据并访问 IncorporationDate 字典键来处理潜在错误。
    【解决方案2】:

    第一步,您必须阅读 CSV 中的所有网址

    import csv
    csvReader = csv.reader('text.csv')
    # next(csvReader) uncomment if you have a header in the .CSV file
    all_urls = [row for row in csvReader if row]
    

    第二步,从URL中获取数据

    from urllib.request import urlopen
    def get_jsonparsed_data(url):
        response = urlopen(url)
        data = response.read().decode("utf-8")
        return json.loads(data)
    
    url_data = get_jsonparsed_data("give_your_url_here")
    

    第三步

    1. 浏览您从 CSV 文件中获得的所有 URL
    2. 获取 JSON 数据
    3. 获取您需要的字段,在您的情况下为“IncorporationDate”
    4. 写入输出 CSV 文件,我将其命名为 IncorporationDates.csv

    代码如下:

    for each_url in all_urls:
        url_data = get_jsonparsed_data(each_url)
        with open('IncorporationDates.csv', 'w' ) as abc:
            abc.write(url_data['primaryTopic']['IncorporationDate'])
    

    【讨论】:

    • 非常感谢您的演练,您实际上是在帮助我理解代码流程。我在 url_data = get_jsonparsed_data() 之后遇到了一个错误,说 get_jsonparsed_data() 正好需要 1 个参数(给定 0),这可能是由于我的设置造成的?不过,下面发布的另一个解决方案现在对我有用。
    • 啊啊啊!!我错过了在 get_jsonparsed_data() 函数中传递参数。我现在已经更新了。 :) 感谢您的反馈。
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2023-03-17
    • 2021-06-12
    相关资源
    最近更新 更多