объект «список» не вызывается при вставке в базу данных

#json #python-3.x #sqlite

Вопрос:

Я пытаюсь заполнить базу данных с помощью API запросов. В полезной нагрузке JSON есть несколько списков, но я, похоже, не могу понять это правильно.

Когда я печатаю, я получаю: объект «список» не может быть вызван.

Программа работает нормально, и мои данные выполняются, но оператор SQL запускает то, что я пытаюсь сделать. Нужно ли мне объявлять словарь?

 import json
import urllib.request
import sqlite3
import urllib.parse


connection = sqlite3.connect("database.db")

cursor = connection.cursor()


# API endpoint
API_KEY = ''
API_ENDPOINT = "https://api.newsfilter.io/public/actions?token={}".format(API_KEY)
print(API_ENDPOINT)
# Define the filter parameters


queryString = "symbols: FRSX AND publishedAt:[2021-03-20 TO 2021-04-02]"
#{}".format(mydict)

payload = {
    "type": "filterArticles",
    "queryString": queryString,
    "from": 0,
    "size": 200
}

# Format your payload to JSON bytes
jsondata = json.dumps(payload)
jsondataasbytes = jsondata.encode('utf-8')

# Instantiate the request
req = urllib.request.Request(API_ENDPOINT)

# Set the correct HTTP header: Content-Type = application/json
req.add_header('Content-Type', 'application/json; charset=utf-8')
# Set the correct length of your request
req.add_header('Content-Length', len(jsondataasbytes))

# Send the request to the API
response = urllib.request.urlopen(req, jsondataasbytes)

# Read the response
res_body = response.read()

# Transform the response into JSON
assets = json.loads(res_body.decode("utf-8"))


articles = assets["articles"]


for asset in articles:
    #print(asset)
    try:
         cursor.execute("""
            INSERT INTO news_SEC (id, title, description, url, imageurl, publishedAt, source, symbol, cik) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) 
    """,(articles('id'), articles('title'), articles('description'), articles('url'), articles('imageurl'), articles('publishedAT'), articles('source'), articles('symbol'), articles('cik')))
    
    except Exception as e:
        print(e)
        print(asset)
    

connection.commit()
 

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

1. внутри вашего цикла for вы хотите получить доступ к данным через asset["id"] , а не articles["id"] через . Первое, скорее всего, является dict, в то время как второе представляет собой список/массив dict, и, следовательно, почему вы получаете ошибку при попытке индексирования в список со строкой.

2. Это было то, что у меня было изначально, но теперь это говорит мне, что объект «дикт» нельзя назвать

3. Попробуйте использовать квадратные скобки вместо круглых asset["id"] или asset.get("id) вместо asset("id")