【发布时间】: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