Seite 1 von 1

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

Verfasst: Sonntag 16. Januar 2022, 20:06
von kangool
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

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

Verfasst: Sonntag 16. Januar 2022, 21:07
von sparrow

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}"

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

Verfasst: Sonntag 16. Januar 2022, 21:32
von Sirius3
@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

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

Verfasst: Sonntag 16. Januar 2022, 21:44
von kangool
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....

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

Verfasst: Sonntag 16. Januar 2022, 22:58
von sparrow
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.

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

Verfasst: Sonntag 16. Januar 2022, 23:58
von kangool
,"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 --- :?: :?: :?:

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

Verfasst: Montag 17. Januar 2022, 00:12
von rogerb
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?

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

Verfasst: Montag 17. Januar 2022, 00:23
von kangool
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 :?:

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

Verfasst: Montag 17. Januar 2022, 04:25
von kangool
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

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

Verfasst: Montag 17. Januar 2022, 11:01
von __blackjack__
@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.