Beautiful Soup - Tabelle auslesen

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
gundu
User
Beiträge: 2
Registriert: Mittwoch 13. Februar 2019, 10:31

Hallo zusammen,

vorab: ich bin totaler Neuanfänger und muss für die Uni ein kleines Programm schreiben.

Mir fehlen entsprechendes Fachjargon, aber ich hoffe ihr könnt mich trotzdem verstehen und weiterhelfen.

Und Nein, ich möchte nicht, dass ihr meine "Hausaufgaben" löst. Ich benötige nur einen kleinen Denkanstoß.

Jetzt zum eigentlichen Problem: Ich muss Daten aus Tabellen unterschiedlicher Webseiten ziehen.

Bei Webseite 1 hat alles problemlos funktioniert. Bei Webseite 2 bekomme ich die ensprechende Spalte aufgrund fehlender eindeutiger Attribute, die ich suchen könnte, nicht ausgegeben.

Anbei mein Programmcode:

# Vorbereitung
import requests
from bs4 import BeautifulSoup
from tkinter import *
import tkinter

#Kennzahl 1: Weltrisikoindex (betrifft Umweltkatastrophen)

html1 = requests.get("https://www.laenderdaten.de/indizes/wel ... index.aspx")
soup1 = BeautifulSoup(html1.content, "html5lib")

#1. Schritt: Länder in Liste schreiben

liste_1=[]

laender = soup1.find_all("a")[27:198]

for land in laender:
liste_1.append(land.get_text())

#2. Schritt: Index in Liste schreiben

liste_2=[]

index = soup1.find_all("b")[9:198]

for ind in index:
liste_2.append(ind.get_text())

#Kennzahl 2: Korruptionswahrnehmungsindex

html2 = requests.get("https://www.laenderdaten.de/indizes/cpi.aspx")
soup2 = BeautifulSoup(html2.content, "html5lib")

#1. Schritt: Länder in Liste schreiben

liste_3=[]

laender2 = soup2.find_all("a")[26:204]

for land2 in laender2:
liste_3.append(land2.get_text())


#Bis hierhin liefs noch ganz gut... Dann kommt das Problem

#2. Schritt: Index in Liste schreiben

liste_4=[]

index2 = soup2.find_all("b")[8:203] #hier möchte ich Spalte 3 (CPI-Wert 2018) ausgegeben bekommen. Ich weiß nur nicht nach welchem Attribut ich suchen soll, b gibt mir diesmal natürlich nur den Rang aus...

for ind2 in index2:
liste_4.append(ind2.get_text())



Ich hoffe, dass mir hier jemand mit einem kleinen Tipp weiterhelfen kann.

Lieben Dank und beste Grüße
gundu
User
Beiträge: 2
Registriert: Mittwoch 13. Februar 2019, 10:31

Thema hat sich erledigt und lässt sich von mir nicht löschen.

@Administratoren oder Moderatoren: Bitte entfernen!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gundu: Das ist so gar nicht robust und ich würde sogar soweit gehen zu sagen es ist falsch was Du da machst. Die zusammengehörigen Werte stehen ja in gleichen Tabellenzeilen. Da nach *alle* Links aus der Seite und *alle* Fett gesetzten Texte zu suchen und dann mit irgendwelchen magischen Indizes diese beiden Listen ”zusammenzuführen” ist keine gute Idee. Da muss ja nur mal ein Link mehr oder weniger und/oder ein Text mehr oder weniger vor der Tabelle gesetzt werden, und schon passt das nicht mehr.

Man könnte sich die Kopfzelle mit dem Inhalt 'Land' suchen und von da zur Zeile hochhangeln und dann die Zeilen durchgehen und da jeweils die entsprechenden Zellen auslesen.

Zudem ist es unsinnig die zusammengehörenden Daten in verschiedene ”parallele” Listen zu stecken und die dann auch noch an durchnummerierte Namen zu binden. Für eine sinnvolle Verarbeitung wird man die Listen dann ja zusammenführen müssen, also wäre es sinnvoll das *gleich* zu machen und nicht erst in mehreren Listen zu sammeln.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten