Ошибка ключа Python: ‘destinationAccount’

#python #web-scraping #python-requests

#python #очистка веб-страниц #python-запросы

Вопрос:

у меня есть код со следующей структурой с веб-сайта, с которого я очищаю данные:

 destinationAccount:
   ownerBuilding: ( collapse to destinationAccount)
     label: ( collapse to ownerBuilding )
     _id: ( collapse to ownerBuilding )
vban: ( collapse to destinationAccount)
_id: ( collapse to destinationAccount)
  

Когда я пытаюсь прочитать этот ключ с помощью этого

 vban = str(transaction["destinationAccount"]["vban"])
  

Это дает мне KeyError: 'destinationAccount'

У кого-нибудь есть идея, почему это происходит? Когда я запускаю свой код, он копирует все, что мне нужно, в базу данных MySQL, но, как я уже сказал, всплывающее окно KeyError и интервал не работают

 sched = BlockingScheduler()
sched.add_job(start, 'interval', seconds=5)
sched.start()
  

потому что он перестает выполняться после появления ошибки. Когда я комментирую это vban = str(transaction["destinationAccount"]["vban"]) , ошибка не возникает. Я проверил уже более 10 раз, структура есть на веб-сайте, как я показал вверху. Любое решение было бы потрясающим.

 def getData():
    databaseConn = dbConnect()
    cursor = databaseConn.cursor()

    for x in range(3):
        x = x * 25
        transactions = json.loads(makeRequest("URL.bla/transactions?offset="   str(x), authToken, True).text)
        for transaction in transactions:
            person = ""
            try:
                person = transaction["destinationAccount"]["ownerCharacter"]["name"]
            except:
                try:
                    person = transaction["destinationAccount"]["ownerFactory"]["label"]
                except:
                    try:
                        person = transaction["destinationAccount"]["ownerBuilding"]["label"]
                    except:
                        person = str("unbekannt")

            reference = ""
            try:
                reference = str(translateTable[transaction["reference"]])
            except:
                reference = str(transaction["reference"])

            vban = str(transaction["destinationAccount"]["vban"])
            amount = str(transaction["amount"])
            taxAmount =str(transaction["taxAmount"])
            gesamt = (float(amount)   float(taxAmount))

            created = parse(str(transaction["created"]))
            date = str(created.date())
            time = str(created.time()).split(".")[0]

            sql = "INSERT INTO finanzen (transaktion, date, time, sendto, vban, amount, tax, gesamt, text) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"
            val = (str(transaction["uuid"]), date, time, str(person), vban, amount, taxAmount, gesamt, reference)
            try:
               cursor.execute(sql, val)
               databaseConn.commit()
            except:
                print("Fehler Datenbank")
    dbClose(databaseConn,cursor)
  

Результат печати :

 {'_id': 'CENSORED', 
'uuid': 'CENSORED', 
'amount': 11.8421, 
'taxAmount': 3.1479, 
'type': 'digital', 
'created': 'Date', 
'reference': 'CENSORED', 
'sourceAccount': {'_id': 'CENSORED', 
'ownerCharacter': {'_id': 'CENSORED', 
'name': 'NAME'}, 
'vban': 'NUMBER'}, 
'destinationAccount': {'_id': 'CENSORED', 
'vban': 'NUMBER', 
'ownerBuilding': {'_id': 'CENSORED', 
'label': 'Eclipse Towers'}}}
  

Комментарии:

1. Пожалуйста, вставьте код Python, который вы запускаете

2. Отредактировано в основном сообщении.

3. Пожалуйста, распечатайте transactions после transactions = json.loads(makeRequest("URL.bla/transactions?offset=" str(x), authToken, True).text) и обновите вопрос

4. Обновлено. Но, как я уже сказал, это я уже тестировал, но вообще не могу найти никакой ошибки.

5. что такое [ в начале печати? Это список? где ] ?

Ответ №1:

Сложно не видеть полный список, но я подозреваю, что в некоторых элементах отсутствует ключ. Вы пробовали проверять существующий ключ. Используя ваш пример:

 transaction = {
   "_id":"CENSORED",
   "uuid":"CENSORED",
   "amount":11.8421,
   "taxAmount":3.1479,
   "type":"digital",
   "created":"Date",
   "reference":"CENSORED",
   "sourceAccount":{
      "_id":"CENSORED",
      "ownerCharacter":{
         "_id":"CENSORED",
         "name":"NAME"
      },
      "vban":"NUMBER"
   },
   "destinationAccount":{
      "_id":"CENSORED",

      "ownerBuilding":{
         "_id":"CENSORED",
         "label":"Eclipse Towers"
      }
   }
}

if 'vban' in transaction['destinationAccount']:
    vban = str(transaction["destinationAccount"]["vban"])
else:
    vban = "none"
  

Комментарии:

1. Ключ определенно существует. В начале моего вопроса я также написал, что когда я выполняю все, что работает, эта ошибка ключа приходит в любом случае. Все копируется в базу данных, как и предполагалось. Всегда есть номер, нет записей, где этот номер недоступен. Потому что это переводы.

2. кстати, решение, которое вы ему дали, выдает ту же ошибку, а также полный список в первом сообщении, он просто повторяется снова и снова с другими номерами, именами.

Ответ №2:

Спасибо @Johnny John Boy за подсказку.

             vban = ""
            try:
                vban = str(transaction["destinationAccount"]["vban"])
            except:
                try:
                    vban = str(transaction["sourceAccount"]["vban"])
                except:
                    vban = str("Unbekannt")
  

Это решение для исправления ошибки ключа, потому что была вторая часть. теперь он работает так, как должен, без каких-либо ошибок.