#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")
Это решение для исправления ошибки ключа, потому что была вторая часть. теперь он работает так, как должен, без каких-либо ошибок.