Твиттер-API возвращает json, тип dictionary
в Python.Когда вы вызываете ключи, используя синтаксис dict[key]
, это называется subscripting
.Теперь вложенные вызовы объекта dict зависят от того, является ли этот объект типом словаря:
dict[a][b]
полагается на dict[a]
, являющийся словарем с ключом b
, доступным.Если dict[a]
- это другой тип, скажем None
или int
, это , а не .Это означает, что для этого типа не обязательно есть атрибут get
.Простой способ исправить это будет следующим:
check = tweets[j]['statuses'][k]['place']
if isinstance(check, dict):
# do things
Это гарантирует, что check
имеет тип dict
и, следовательно, может быть подписан с помощью ключа
EDIT: Примечание.что использование dict[key]
синтаксиса не безопасно против KeyErrors
.Если вы хотите избежать этого, используйте get
:
my_dictionary = {'a': 1, 'b': 2}
my_dictionary['c'] # Raises KeyError: 'c' not in dictionary
my_dictionary.get('c') # returns None, no KeyError
Это принимает форму dict.get(key, <return_value>)
, где return_value
по умолчанию None
Чтобы сделать вашу программу немногоболее читабельным и избежать неизбежного бесконечного цикла, угробить цикл while
:
# This will get individual tweets
for tweet in tweets:
# Returns all statuses or empty list
statuses = tweet.get('statuses', [])
for status in statuses:
if not isinstance(status, dict):
continue # will jump to next iteration of inner for loop
# Will be a name or None, if empty dict is returned from place
name = status.get('place', {}).get('name')
if name:
print(name)