Python in PyCharm BeautifulSoup beide Classen haben denn Gleichen Namen?

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]

Tester99121 
Beitragsersteller
 11.06.2022, 19:16

Habe es jetzt anders hinbekommen ^^

Aber ich hätte da noch 2 Fragen (Bild: https://ibb.co/s1c0pm6 und https://ibb.co/wJwbjKS )

  1. Wie bekomme ich das Wort "Benötigte" entfernt.

Wie bekomme ich die Zahlen 1 manchmal ist es auch zahl 3 usw.. neben bsp.

Drehleitern 1

ELW 1 1

Löschfahrzeuge 1

mfg

0
regex9  11.06.2022, 20:25
@Tester99121

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
1
Tester99121 
Beitragsersteller
 11.06.2022, 23:53
@regex9

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

0
regex9  12.06.2022, 03:04
@Tester99121

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)
0
Tester99121 
Beitragsersteller
 12.06.2022, 11:46
@regex9

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!

0
regex9  12.06.2022, 17:23
@Tester99121

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)
0
regex9  14.06.2022, 17:07
@Tester99121

Die find-Methode sucht nach dem ersten Vorkommen. Die find_all-Methode sucht nach allen Vorkommen.

0
Tester99121 
Beitragsersteller
 14.06.2022, 17:16
@regex9

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

0
regex9  14.06.2022, 18:49
@Tester99121

Ä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.

0
Tester99121 
Beitragsersteller
 14.06.2022, 18:56
@regex9

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

0
regex9  15.06.2022, 14:03
@Tester99121

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:

1