我正在嘗試制作一個程式,獲取國家名稱,訪問restcountries.com,獲取該國家當前的人口數量,再做同樣的事情,并判斷人口是否變大/變小/相同。我是 Python 和編碼的初學者,因此對類似問題的現有答案對我來說并不是那么有用,因為它們似乎與我的問題不同。我已經設法讓代碼從站點獲取 JSON,保留它,并告訴我人口數量并且它起作用了(我用“以色列”測驗了它。但是當我把它交給我的朋友時,他寫了“俄羅斯”和它失敗了。經過簡短的調查,我發現 restcountries.com 以“俄羅斯聯邦”的名義呼叫俄羅斯,并且有一個單獨的 JSON 字典鍵用于稱為“common:”的常用名稱。但我無法訪問它并通過以下方式提取它代碼。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.")
如何讓我的代碼僅通過“通用”名稱識別一個國家?
uj5u.com熱心網友回復:
這里似乎有很多不必要的代碼:
首先,API 回傳 JSON,因此我不明白您為什么需要使用bs4. 您可以將 JSON 加載到dictusing 中json.loads。
其次,您不需要位元組物件的字串表示形式 - 而是解碼位元組。因此,您可以使用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]可以獲取該國家/地區的人口。
此外,我建議您了解并使用背景關系管理器。例如,我會將save函式更改為(還有,為什么會這樣return True?):
def save(country_population):
with open('G:\HackerU\Python\Challenges\Population\dataname.txt','w') as datafile:
datafile.write(country_population)
祝你在課程中好運,Python 是一種很好的開始編碼的語言。
uj5u.com熱心網友回復:
您的問題與 json 資料的格式有關。替換if p['name'] == name:為if p['name']['common'] == name:
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393713.html
下一篇:如何使用每個鍵的多個值反轉字典?
