Python in PyCharm BeautifulSoup beide Classen haben denn Gleichen Namen?
Hallo, ich habe ein Problem und zwar haben beide Klassen denn gleichen namen. Wie bekomme ich das hin, damit die klasse (Bild 2) ausgewählt wird, bei mir wird nur die Klasse (Bild 1) ausgewählt, aber die brauche nicht gar nicht im Bild 3 sieht man die Ausgabe und meinen Code.
mfg
Bild 1.
Bild 2.
Bild 3.
1 Antwort
Das ist eine wesentliche Eigenschaft von Klassenselektoren. Sie können mehreren Elementen in einem HTML-Dokument zugeordnet werden.
BeautifulSoup hat auch noch eine find_all-Methode. Mit der kannst du alle Vorkommen für den Selektor suchen. Als Ergebnis bekommst du eine Liste, aus der du wiederum via Index das richtige Element herausfiltern kannst.
Beispiel:
tables = soup.find_all("table.table.table-striped")
if len(tables) > 1:
second_table = tables[1]
1) Das Wort kannst du gegen eine leere Zeichenkette austauschen.
Beispiel:
text = "Hello world"
text = text.replace(" world", "")
2) Du kannst den Text anhand von Leerzeichen auftrennen. Der letzte Eintrag wäre die Zahl.
Beispiel:
text = "Hello world"
text_parts = text.split(" ")
print(text_parts[-1]) # world
soweit so gut aber irgendwie ist das bisschen doof Beim Löschfahrzeuge x1 Klappt es aber bei ELW 1 x1 Klappt es nicht da ELW 1 also die 1 zum Fahrzeug gehört und nicht zu der Anzahl kann man das irgendwie beheben ?
mfg
Der Kommentar bezog sich auf eine Lösung für Werte innerhalb einer Spalte. Da der Wert in einer eigenen Spalte steht, brauchst du keine Stringbearbeitungen durchführen.
Statt durch alle td-Elemente zu laufen und einfach nur die Werte nacheinander in einen String zu vereinen, wäre es besser, über alle tr-Elemente zu iterieren und dabei jedesmal die Werte der untergeordneten td-Elemente in eine Liste o.ä. zu speichern.
Ungefähr so:
class Resource:
def __init__(self, name, value):
self.name = name
self.value = value
resources = []
for row in table.find_all("tr"):
columns = row.find_all("td")
if len(columns) > 1:
resource = Resource(columns[0].text, columns[1].text)
resources.append(resource)
Habe es jetzt mal so reingemacht ^^ also anscheint Klappt es ja bloß kommt dort Zahlen codes zb. [<__main__.Resource object at 0x0000028D093721F0>]
Bild: https://ibb.co/zPbYdDc
Was stimmt dort nicht und nochmal Danke das du mir Hilfst!
In resources liegen komplexe Objekte und die Liste selbst ist auch ein Objekt. Wenn du versuchst, die direkt auszugeben, liefert Python nur Informationen zum Speicherort / Typnamen. Entweder du gibst die Eigenschaften einzeln aus:
for resource in resources:
print(resource.name, resource.value)
oder du definierst eine textuelle Darstellung bei Ausgabe. Dazu müsste die Resource-Klasse um eine Methode ergänzt werden.
def __str__(self):
return self.name + " " + self.value
Ausgabe:
for resource in resources:
print(resource)
Moin habe wieder das Problem das mir wieder nur die 1 Klasse angezeigt wird satt die 2 Klasse Bild 1: https://ibb.co/1vYSkRJ Bild 2: https://ibb.co/jkkDLzz habe alles so gemacht wie du gemeint hast :/ verstehe einfach nicht wieso es nicht klappt
Die find-Methode sucht nach dem ersten Vorkommen. Die find_all-Methode sucht nach allen Vorkommen.
Ja Du meinst jetzt bei tables = soup..... Wenn ich find_all mach kommt diese Meldung https://ibb.co/m0Y6fVM mach ich aber nur find https://ibb.co/HzvPCKX Klappt es bloß er gibt nur die 1 Tabelle aus die ich gar nicht brauche :/ btw bin dir echt dankbar das du mir hilfst
Habe ich getan jetzt bekomme ich wenn ich es mir auslesen lasse ein Error
ich verzweifle grade echt ^^
Ähmn, ich überlege gerade, ob ich dir nicht besser ein Grundlagentutorial verlinken sollte. Bei second_table handelt es sich um eine lokale Variable. Die ist also nur in dem Code-Block bekannt, in dem sie auch definiert wurde. Das wäre in dem Fall der if-Rumpf. Die if-Abfrage ist zudem nicht grundlos da. Sollte sich die Webseite irgendwann einmal dahingehend ändern, dass Elemente unter dem Selektor nicht mehr auffindbar sind, stürzt das Skript an der Stelle nicht gleich ab.
Ja ich habe es auch in der if-Abfrage gelassen aber dennoch gibt er mir nichts aus sorry das grade eben war echt doof von mir.. aber wenn du ein Gutes Grundlagentutorial hast würde ich das auch gerne mal anschauen ich habe mir bis jetzt alles selbst beigebracht und eigentlich die Videos wo ich mir bis jetzt angeschaut habe waren Information die ich schon wusste
Prüfe einzelne Zwischenergebnisse mittels Debugger/Konsolenausgaben gegen (wie die Länge von tables) und schau ebenso, ob du in deinem Skript Einrückungsfehler o.ä. hast oder falsche Bezeichner verwendest. Ich sehe derzeit keinen Grund, wieso es nicht klappen sollte.
Bezüglich Python-Tutorials: Am liebsten empfehle ich Bücher. Der Rheinwerk-Verlag bietet bspw. eine Reihe ziemlich dicker Wälzer. Wenn du Zugang zu einer Bibliothek hast, findest du vielleicht auch dort etwas (alles ab Python 3 ist in Ordnung).
Online könntest du auf folgende Seiten schauen:
- Real Python (auf dieser Plattform findest du ebenso Artikel zu spezialisierten Themen wie PyQt, tkinter, Django, etc. - zu BeautifulSoup habe ich gerade auch ein Einsteigertutorial gefunden)
- The Hitchhiker's Guide to Python
- A Byte Of Python
- JetBrains Academy
- Die offizielle Dokumentation verweist in ihrer Getting Started-Sektion auf diverse Lernmaterialien sowie ein eigenes Kurztutorial.
Habe es jetzt anders hinbekommen ^^
Aber ich hätte da noch 2 Fragen (Bild: https://ibb.co/s1c0pm6 und https://ibb.co/wJwbjKS )
Wie bekomme ich die Zahlen 1 manchmal ist es auch zahl 3 usw.. neben bsp.
Drehleitern 1
ELW 1 1
Löschfahrzeuge 1
mfg