via urllib js in neues file speichern Fehler "list indices must be integers or slices, not str"

Code-Stücke können hier veröffentlicht werden.
Antworten
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

ich habe hier ein script welches mir via urlib daten in form von js übergibt
daraus speichere ich gewisse einträge in einem file

js sieht wie folgt aus

Code: Alles auswählen

{"js":{"total_items":1,"max_page_items":14,"selected_item":0,"cur_page":0,"data":[{"id":"1693:1","owner":"","name":"Season 1","old_name":"","o_name":"Season 1","fname":"","description":"N\/A","pic":"","cost":0,"time":"N\/a","file":"","path":"Pi\u0119kni_i_bezrobotni","protocol":"","rtsp_url":"","censored":0,"series":[1,2,3,4,5,6],"volume_correction":0,"category_id":"367","genre_id":0,"genre_id_1":0,"genre_id_2":0,"genre_id_3":0,"hd":1,"genre_id_4":0,"cat_genre_id_1":"367","cat_genre_id_2":0,"cat_genre_id_3":0,"cat_genre_id_4":0,"director":"N\/A","actors":"Robert G\u00f3rski, Miko\u0142aj Cie\u015blak, Wojciech Kalarus, Anna Karczmarczyk","year":"2021-03-06","accessed":1,"status":1,"disable_for_hd_devices":0,"added":"2021-10-06 14:31:04","count":0,"count_first_0_5":0,"count_second_0_5":0,"vote_sound_good":0,"vote_sound_bad":0,"vote_video_good":0,"vote_video_bad":0,"rate":"","last_rate_update":"","last_played":"","for_sd_stb":0,"rating_imdb":"N\/A","rating_count_imdb":"","rating_last_update":"0000-00-00 00:00:00","age":"12+","high_quality":0,"rating_kinopoisk":"N\/A","comments":"","low_quality":0,"is_series":1,"year_end":0,"autocomplete_provider":"imdb","screenshots":"","is_movie":1,"lock":0,"fav":0,"for_rent":0,"screenshot_uri":"https:\/\/image.tmdb.org\/t\/p\/w600_and_h900_bestv2\/mI6P1Md9FUXZnm6hug81DQLl26p.jpg","genres_str":"Comedy","cmd":"eyJ0eXBlIjoic2VyaWVzIiwic2VyaWVzX2lkIjoxNjkzLCJzZWFzb25fbnVtIjoxfQ==","week_and_more":"October 2021","has_files":0}]}}
mein script bzw der abschnitt soweit er funktioniert und das tut er tadellos sieht so aus

Code: Alles auswählen

def getSeasons(portal_mac, url, serial, path):
    args = urllib.parse.parse_qs(sys.argv[2][1:])
    cat     = args['cat'][0];
    category     = args['category'][0];
    now = time();
    portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url));
    portalurl = path + '/' + portalurl + '-season'+cat;
    
    setMac(portal_mac);
    #setSerialNumber(serial);
    
    if not os.path.exists(path):
        os.makedirs(path)
    
    if os.path.exists(portalurl):
        #check last time
        with open(portalurl, 'rb') as data_file: data = json.load(data_file);
    
        if 'version' not in data or data['version'] != cache_version:
            clearCache(url, path);
            
        else:
            time_init = float(data['time']);
            # update 12h
            if ((now - time_init) / 3600) < 12:
                return data;
    
    handshake(url);
    
    data = '{ "version" : "' + cache_version + '", "time" : "' + str(now) + '", "season'+cat+'" : [  \n'
    
    page = 1;
    pages = 300;
    total_items = 1.0;
    max_page_items = 1.0;
    
    while True:
        info = retrieveData(url, values = {
            'type' : 'series', 
            'action' : 'get_ordered_list',
            'category' : category,
            'movie_id' : cat,
            'sortby' : 'added',
            'season_id' : '0',
            'episod_id' : '0',
            'p' : page,
            'JsHttpRequest' : '1-xml'})
        
        total_items = float(info['js']['total_items']);
        max_page_items = float(info['js']['max_page_items']);
        pages = math.ceil(total_items/max_page_items);
        
        results = info['js']['data']

        for i in results:
            cat     = i["id"]
            name     = i["name"]
            cmd     = i['cmd']
            logo     = i["screenshot_uri"]
            plot    = i["description"]
            plot    = plot.replace('"',"-")
            plot    = plot.replace("\r","")
            plot    = plot.replace("\n", " ")
            plot    = plot.replace("  "," ")
            genre    = i['genres_str']
            year     = i["year"]
            category     = i['category_id']

            
            data += '{'
            data += '"category":"' + category + '", '
            data += '"cat":"' + cat + '", '
            data += '"name":"' + name + '", '
            data += '"cmd":"' + cmd + '", '
            data += '"logo":"' + logo + '", '           
            data += '"plot":"' + plot + '", '
            data += '"genre":"' + genre + '", '         
            data += '"year":"' + year + '"}, \n'
            

        page += 1;
        if page > pages or page == 300:
            break;

    data = data[:-3] + '\n]}'

    with open(portalurl, 'wb') as f: f.write(data.encode('utf-8'));
    
    return json.loads(data.encode('utf-8'), strict=False);
das funtioniert soweit so gut
jetzt möchte ih noch ein 2tes file abspeichern mit dem inhalt aus

results = info['js']['data']['series']

damit möchte ich zu diesem inhalt kommen : --- "series":[1,2,3,4,5,6] ---

da bekomme ich aber den fehler wie oben in der Beschreibung

"list indices must be integers or slices, not str"

wie komme ich an diesen eintrag und wie kann ich ihn am besten "umbenennen"
so würde ich es brauchen

"episode":"' +zahl+'" (1 nächstes 2 nächstes 3 usw)

so wie oben im script mit den anderen daten halt
das dann eine datei entsteht wo in jeder zeile/eintrag dann fortlaufend die zahl steht
das andere benötigte kann ich mir ja dann von der erstellten datei holen.

lg ronald und danke fürs helfen
Benutzeravatar
sparrow
User
Beiträge: 4370
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

info['js']['data']
ist eine Liste. Listen haben nichts, worauf du mit einem benannten Index zugreifen kannst. Das sagt auch die Fehlermeldung.

Ansonsten ist das, was du da mit Zeichenketten machst, nicht so schön. Die bastelt man nicht mit + zusammen sondern verwendet f-Strings

Code: Alles auswählen

name = "Foo"
gruss = f"Hallo {name}"
Sirius3
User
Beiträge: 18054
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: nein, da bastelt man gar keine Strings zusammen, die eigentlich json sind.

@kangool: ; braucht man in Python nicht.
`total_items` und `max_page_items` werden vor der Schleife initialisiert, aber gar nicht gebraucht. Das sollten auch keine floats sein.
Json-Daten setzt man nicht als String zusammen, sondern benutzt Wörterbücher und Listen.

Code: Alles auswählen

def get_seasons(portal_mac, url, serial, path):
    args = urllib.parse.parse_qs(sys.argv[2][1:])
    cat = args['cat'][0]
    category = args['category'][0]
    now = time()
    portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url))
    portalurl = os.path.join(path, portalurl + '-season' + cat)
    
    setMac(portal_mac)
    #setSerialNumber(serial)
    
    if not os.path.exists(path):
        os.makedirs(path)
    
    if os.path.exists(portalurl):
        #check last time
        with open(portalurl, 'rb') as data_file:
            data = json.load(data_file)
    
        if 'version' not in data or data['version'] != cache_version:
            clearCache(url, path)
            
        else:
            time_init = float(data['time'])
            # update 12h
            if ((now - time_init) / 3600) < 12:
                return data
    
    handshake(url)
    
    seasons = []
    for page in range(1, 300):
        info = retrieveData(url, values = {
            'type' : 'series', 
            'action' : 'get_ordered_list',
            'category' : category,
            'movie_id' : cat,
            'sortby' : 'added',
            'season_id' : '0',
            'episod_id' : '0',
            'p' : page,
            'JsHttpRequest' : '1-xml'})
        
        total_items = info['js']['total_items']
        for result in info['js']['data']:
            plot = result["description"]
            plot = plot.replace('"',"-").replace("\r","").replace("\n", " ").replace("  "," ")
            seasons.append({
                "category": result['category_id'],
                "cat": result["id"],
                "name": result["name"],
                "cmd": result['cmd'],
                "logo": result["screenshot_uri"],
                "plot": plot,
                "genre": result['genres_str'],
                "year": result["year"],
            })
        if len(seasons) >= total_items:
            break

    data = {
        "version" : cache_version,
        "time" : now,
        'season'+cat: seasons,
    }
    with open(portalurl, 'wb') as f:
        jsond.dump(data, f)

    return data
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

Sirius3 hat geschrieben: Sonntag 16. Januar 2022, 21:32 @sparrow: nein, da bastelt man gar keine Strings zusammen, die eigentlich json sind.

@kangool: ; braucht man in Python nicht.
`total_items` und `max_page_items` werden vor der Schleife initialisiert, aber gar nicht gebraucht. Das sollten auch keine floats sein.
Json-Daten setzt man nicht als String zusammen, sondern benutzt Wörterbücher und Listen.

Code: Alles auswählen

def get_seasons(portal_mac, url, serial, path):
    args = urllib.parse.parse_qs(sys.argv[2][1:])
    cat = args['cat'][0]
    category = args['category'][0]
    now = time()
    portalurl = "_".join(re.findall("[a-zA-Z0-9]+", url))
    portalurl = os.path.join(path, portalurl + '-season' + cat)
    
    setMac(portal_mac)
    #setSerialNumber(serial)
    
    if not os.path.exists(path):
        os.makedirs(path)
    
    if os.path.exists(portalurl):
        #check last time
        with open(portalurl, 'rb') as data_file:
            data = json.load(data_file)
    
        if 'version' not in data or data['version'] != cache_version:
            clearCache(url, path)
            
        else:
            time_init = float(data['time'])
            # update 12h
            if ((now - time_init) / 3600) < 12:
                return data
    
    handshake(url)
    
    seasons = []
    for page in range(1, 300):
        info = retrieveData(url, values = {
            'type' : 'series', 
            'action' : 'get_ordered_list',
            'category' : category,
            'movie_id' : cat,
            'sortby' : 'added',
            'season_id' : '0',
            'episod_id' : '0',
            'p' : page,
            'JsHttpRequest' : '1-xml'})
        
        total_items = info['js']['total_items']
        for result in info['js']['data']:
            plot = result["description"]
            plot = plot.replace('"',"-").replace("\r","").replace("\n", " ").replace("  "," ")
            seasons.append({
                "category": result['category_id'],
                "cat": result["id"],
                "name": result["name"],
                "cmd": result['cmd'],
                "logo": result["screenshot_uri"],
                "plot": plot,
                "genre": result['genres_str'],
                "year": result["year"],
            })
        if len(seasons) >= total_items:
            break

    data = {
        "version" : cache_version,
        "time" : now,
        'season'+cat: seasons,
    }
    with open(portalurl, 'wb') as f:
        jsond.dump(data, f)

    return data
wow danke da werd ich dann meine ganzen scripte neu gestallten müssen...

mir stellt sich nach wie vor die frage wie ich nun
"series":[inhalt]
abgespeichert bekomme....
Benutzeravatar
sparrow
User
Beiträge: 4370
Registriert: Freitag 17. April 2009, 10:28

Da gibt es nichts, was series heißt. Das schrieb ich doch bereits. info['js']['data'] ist eine Liste. In diesem Fall befindet sich darin ein einzigs Element mit einem dict.
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

,"censored":0,"series":[1,2,3,4,5,6],"volume_correction":0,"category_id":"367"

also ist der eintrag "series":[1,2,3,4,5,6] in der "liste" eine eigene liste
also eine liste in der liste?
da es der einzige eintrag ist der in [ ] steht und nicht in "".
ausser halt data


sorry für die dummen fragen.... :cry: :cry:

ich hab schon alleine ewig gebracht das ich es soweit ans laufen bekommen habe
und nun sagt man mir ist eigentlich nicht richtig gemacht und nun tun sich wieder zig tausend fehler und fragen auf --- :?: :?: :?:
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

sparrow hat geschrieben: Sonntag 16. Januar 2022, 22:58 info['js']['data'] ist eine Liste.
Ja, ...

info["js"]["data"][0]["series"]

liefert dann:

[1, 2, 3, 4, 5, 6]

Wo ist das Problem?
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

ah ok mir fehlte dann eben [0]

warum gehört die 0 da mit rein?

und nein gibt nicht 1,2,3,4,5,6 sondern nur 1 :?:
kangool
User
Beiträge: 12
Registriert: Mittwoch 24. März 2021, 21:30

der editbutton ist auf einmal weg

jetzt gehts komischerweise

danke mir wurde hier ein grosses stück weiter geholfen und ich hab auch wieder was dazugelernt
herzlichen dank
Benutzeravatar
__blackjack__
User
Beiträge: 13572
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kangool: Bearbeiten von Beiträgen ist zeitlich begrenzt. Hauptsächlich um Spammer zu behindern. Eine übliche Masche um Linkspam zu platzieren ist einen scheinbar harmlosen Beitrag zu erstellen und dann nach ein paar Wochen, wenn das Thema nicht mehr aktuell ist, den Beitrag klammheimlich zu verändern/mit Spamlinks zu versehen.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten