【问题标题】:Access a dictionary key inside a dictionary key [closed]访问字典键中的字典键[关闭]
【发布时间】:2022-01-25 19:05:20
【问题描述】:

我正在尝试制作一个程序,它可以获取国家名称,访问 restcountries.com,获取该国当前的人口数量,再次执行相同的操作,并判断人口是否变大/变小/相同。我是 python 和编码的初学者,所以对类似问题的现有答案对我来说不是那么有用,因为它们看起来与我的问题不同。我已经设法让代码从网站上获取 JSON,保留它,并告诉我人口数量并且它有效(我用“以色列”对其进行了测试。但是当我把它交给我的朋友时,他写了“俄罗斯”和它失败了。经过短暂的调查后,我发现 restcountries.com 以“俄罗斯联邦”的名称调用俄罗斯,并有一个单独的 JSON 字典键用于常见名称,称为“common:”。但我无法找到它并通过以下方式提取它代码。这是来自此 URL 的 JSON:https://restcountries.com/v3/name/russia?fields=name,population [{"name":{"common":"Russia","official":"Russian Federation","nativeName":{"rus":{"official":"Российская Федерация","common":"Россия"}}},"population":144104080}]

这是我当前的代码:

import bs4
import urllib.request
import json

country_name = input("Choose country: ")
# Getting updated list and saving it as "json_data"
link = 'https://restcountries.com/v3/name/' + country_name + '?fields=name,population'
webpage = str(urllib.request.urlopen(link).read())
soup = bs4.BeautifulSoup(webpage, "html.parser")
json_data = soup.get_text()
# Cleans json_data from all the bullshit
clean_json = json_data[:-1][2:].replace('\\', '.') \
    .replace('.xc3.x85', 'A').replace('.xc3.xa7', 'c').replace('.xc3.xa9', 'e')

# Convert clean_json to a dictionary
loaded_json = json.loads(clean_json)


# Country search function
def search(name):
    for p in loaded_json:
        if p['name'] == name:
            return p['population']


# Choose Country, save data.
country_population = search(country_name)

datafile = open('G:\HackerU\Python\Challenges\Population\dataname.txt','w')

def save(done):
    datafile = open('G:\HackerU\Python\Challenges\Population\dataname.txt','w')
    datafile.write(country_population)
    datafile.close()
    return True

saved_population_number = datafile.read()
if saved_population_number > country_population:
    print("Population number has been decreased.")
elif saved_population_number < country_population:
    print("Population number has risen.")
elif saved_population_number == country_population:
    print("Population number stayed the same.")
else:
    print("Unknown Error.")

如何让我的代码仅通过“通用”名称识别国家/地区?

【问题讨论】:

  • " 他写了“俄罗斯”,但失败了。” 什么失败了?请提供minimal reproducible example。如果您遇到错误,请发布完整的错误消息,包括堆栈跟踪。说“失败”是不是一个适当的问题规范
  • 你为什么还要在这里使用bs4?这是一个 API,它返回 JSON。
  • "clean_json = json_data[:-1][2:].replace('\\', '.') \ .replace('.xc3.x85', 'A').replace('.xc3.xa7', 'c').replace('.xc3.xa9', 'e')" 没有!这里的问题是您通过执行str(urllib.request.urlopen(link).read()) 引入了一堆垃圾,但您不想要 bytes 对象的字符串表示,您想要解码 字节,所以只需使用response = urllib.request.urlopen(link).read().decode(),然后您只需要data = json.loads(response)。删除所有 bs4 和“清洁”。您不必“清理”从 API 返回的 json

标签: python json dictionary


【解决方案1】:

这里好像有很多不必要的代码:

首先,API 返回一个 JSON,因此我不明白为什么需要使用 bs4。您可以使用 json.loads 将 JSON 加载到 dict

其次,您不需要字节对象的字符串表示形式,而是要解码字节。因此你可以使用urllib.request.urlopen(req).read().decode()

因此我会这样做:

import json
import urllib.request

country_name = input("Choose country: ")
req = 'https://restcountries.com/v3/name/' + country_name + '?fields=name,population'
response = json.loads(urllib.request.urlopen(req).read().decode())[0]

现在您的字典中有 JSON 响应,访问 response['population] 可以获得该国家/地区的人口。

此外,我建议您了解context managers 并使用它们。例如,我会将save 函数更改为(另外,为什么要return True?):

def save(country_population):
    with open('G:\HackerU\Python\Challenges\Population\dataname.txt','w') as datafile:
        datafile.write(country_population)

祝你在课程中好运,Python 是一门很棒的编程语言。

【讨论】:

    【解决方案2】:

    您的问题与 json 数据的格式有关。将if p['name'] == name: 替换为if p['name']['common'] == name:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 2015-11-29
      • 2015-01-19
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      相关资源
      最近更新 更多