Liste mit Schlüsseln und Werten aus Variablen befüllen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Chris87
User
Beiträge: 13
Registriert: Freitag 21. Februar 2020, 23:33

Hallo,

vermutlich ist das wieder eine totale Anfängerfrage. Ich möchte gerne eine Liste erstellen, die Personen mit Schlüsseln und Werten darstellt. Beispiel:

Code: Alles auswählen

    {
	"name": "Max",
	"lastname": "Mustermann",
	"gender": "männlich",
	"age": "41"
    },
    {
	"name": "Erika",
	"lastname": "Mustermann",
	"gender": "weiblich"
    }    
Diese Liste soll automatisch aus Werten erstellt werden, die von einer Webseite ausgelesen werden. In meinem Beispiel kann es sein, dass mal ein Wert fehlt (z.B. "age"). Dieser Wert soll dann ausgelassen werden.

Code: Alles auswählen

person_list = []

for url in urls:
    html = requests.get(url, headers=headers, timeout=20).text
    soup = BeautifulSoup(html, 'lxml')
    
    name = soup.find("span", class_="name").text
    lastname = soup.find("span", class_="lastname").text
    gender = soup.find("span", class_="gender").text
    age = soup.find("span", class_="age")
    
    if age:
        age = age.text
Ich weiß, dass ich mit person_list.append() nun einzelne Werte der Liste hinzufügen kann. Ich verstehe aber nicht, wie ich die Liste mit Schlüsseln und Werten befüllen kann, so dass das Ergebnis wie im oberen Beispiel aussieht.

Vielen Dank im Voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chris87: Du befüllst die Liste ja nicht mit Schlüsseln und Werten sondern mit Wörterbüchern. Du musst halt für jede Person ein Wörterbuch mit den Schlüsseln und Werten erstellen und das dann an die Liste anhängen.

Grunddatentypen haben nichts in Namen verloren. `person_list` wäre also einfach `persons`.

Das zweite Positionsargument von `find()` wird als Klasse angenommen wenn es eine Zeichenkette ist, da kann man sich also das ``class_=`` sparen.

Der Code behandelt nicht den Fall wenn tatsächlich mal eine Zeitüberschreitung vorkommt und geht zudem einfach davon aus das das `text`-Attribut auch tatsächlich der Inhalt ist den Du erwartest und nicht beispielsweise eine Fehlermeldung wenn der Webserver gar nicht die Webseite sendet sondern einen Fehler sendet.

Soll das Alter tatsächlich als Text und nicht als Zahl weiterverarbeitet werden?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Stichwort heißt Wörterbuch (dict), und dazu gibt es ein ganzes Kapitel in der Python-Dokumentation: https://docs.python.org/3/tutorial/data ... ctionaries
Chris87
User
Beiträge: 13
Registriert: Freitag 21. Februar 2020, 23:33

Hallo,

das Alter soll natürlich als Zahl weiterverarbeitet werden.

Der Code war auch nur als Beispiel gedacht. Im finalen Code gibt es dann auch eine Fehlerüberprüfung (Try Except).

Also benötige ich ein Dictionary anstelle einer Liste:

Code: Alles auswählen

persons = {}
Aber wie kann ich das Dictionary dann entsprechend mit den Werten befüllen?

Code: Alles auswählen

persons.update = {'name': name, 'lastname': lastname, "gender": gender}
Würde das so funktionieren? Und muss ich dann, falls das Alter vorhanden ist, eine weitere Bedingung hinzufügen und dort das "persons.update" erneut definieren oder lässt sich das einfacher lösen?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chris87: Nein du brauchst für jede einzelne Person ein Wörterbuch das dann jeweils an die Liste als Wert angehängt wird. Das hast Du doch im Grunde im ersten Beitrag bereits als literale Werte gezeigt. Da fehlt vor dem ganzen nur eine [ und danach eine ] und dann ist das doch genau die Datenstruktur die Du haben willst: Eine Liste mit einem Wörterbuch pro Person:

Code: Alles auswählen

In [69]: [{ 
    ...:   "name": "Max", 
    ...:   "lastname": "Mustermann", 
    ...:   "gender": "männlich", 
    ...:   "age": 41
    ...:     }, 
    ...:     { 
    ...:   "name": "Erika", 
    ...:   "lastname": "Mustermann", 
    ...:   "gender": "weiblich" 
    ...:     }]                                                                      
Out[69]: 
[{'name': 'Max', 'lastname': 'Mustermann', 'gender': 'männlich', 'age': 41},
 {'name': 'Erika', 'lastname': 'Mustermann', 'gender': 'weiblich'}]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Chris87
User
Beiträge: 13
Registriert: Freitag 21. Februar 2020, 23:33

Danke.
Antworten