Iteration über einen String

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
Mike Place
User
Beiträge: 6
Registriert: Freitag 28. Juni 2019, 12:04

Hallo,

kann mir mal jemand über die Straße helfen? ;-) Leider finde ich keine Lösung.

Ich habe einen html_Text als String. Dort habe ich die Tags "name">, "rating"> und position">. Ich möchte den Text dahinter bist zum schliessenden </div auslesen.
Das funktioniert soweit einmal:

name = str(html_text).split('name">')[1].split("</div")[0]
position = str(html_text).split('position">')[1].split("</div")[0]
rating = str(html_text).strip().split('rating">')[1].split("</div")[0]

Wie kann ich das solange mit einer Schleife durchlaufen lassen, dass ich alle Texte von allen Tags erhalte?

Ein Ausschnitt des html_text lautet:

div><div class="playStyle chemstyle250" style="color: rgb(68, 58, 34);"></div></div><div class="name">]Kulusevski</div<div class="rating">82</div><div class="position">RM</div</div></div><div class="playStyle chemstyle250" style="color: rgb(70, 57, 12);"></div></div><div class="name">Correa</div<div class="rating">78</div><div class="position">LF</div<div class="name">Piatti</div<div class="rating">81</div><div class="position">IV</div></div


Vielen Dank für Eure Antworten.
Gruß Michael
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

HTML parst man mit einer darauf spezialisierten Bibliothek. In der Regel mit beautifulsoup.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür benutzt man den passenden Selector:

Code: Alles auswählen

import bs4

html_text = '<div><div class="playStyle chemstyle250" style="color: rgb(68, 58, 34);"></div></div><div class="name">]Kulusevski</div<div class="rating">82</div><div class="position">RM</div</div></div><div class="playStyle chemstyle250" style="color: rgb(70, 57, 12);"></div></div><div class="name">Correa</div<div class="rating">78</div><div class="position">LF</div<div class="name">Piatti</div<div class="rating">81</div><div class="position">IV</div></div>'

html = bs4.BeautifulSoup(html_text)
name_div = html.find("div", class_="name")
Mike Place
User
Beiträge: 6
Registriert: Freitag 28. Juni 2019, 12:04

Danke für Eure Antworten. Das auslesen funktioniert ja. Beautifulsoup ist auch eine Alternative.

Mir geht es darum, wie ich mit einer Schleife alle Tags als Ergenis in einer Liste bekomme. Also sowas wie "for"-Schleife.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Dafür stellt beautifulsoup die entsprechenden Methoden bereit. find_all stat find zum Beispiel.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du als Input, was möchtest Du als Output, und wo kommst Du konkret nicht weiter?
Mike Place
User
Beiträge: 6
Registriert: Freitag 28. Juni 2019, 12:04

Danke für Eure Antworten.

Habe es jetzt mit beautifulsoap4 gelöst. Mit - name = list(html.findAll('div', class_="name")) - kann ich alle vorkommende Tags "name" auslesen.
Ich erhalte zwar:
<div class="name">]Kulusevski</div> , aber das Überflüssige kann ich dann mit split löschen.

name_list = []
for i in range(3):
name_1 = str(name).split('name">')[1].split("</div")[0]
name_list.append(name_1)
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Warum liest du dir nicht mal die Dokumentation von Beautifulsoup durch? Warum greifst du nicht auf den Text der Tags zu, wie es dort beschrieben ist?
Warum iterierst du in der for-Schleife über die Zahlen 0 bis 3, vewendest die aber nicht?

names = [tag.string for tag in html.find_all('div', class_="name")]

Edit: Methoden angepasst.
Zuletzt geändert von sparrow am Montag 26. Oktober 2020, 13:18, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Und warum verwendest Du nicht die aktuelle API, find_all, statt dem veralteten findAll? Aber vielleicht ist das bei Soap ja anders.
Antworten