mit Beautifulsoup span 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
Parzival
User
Beiträge: 4
Registriert: Dienstag 4. Juni 2019, 20:59

Hey,

Ich bin neu in dem ganzen Thema Python und wollte mir jetzt einen kleinen crawler bauen der mir Stats aus CSGO von einer seite zieht.
Das HTML stück habe ich schon soweit eingekürtzt dass nur noch die "wichtigen" informationen + ein bisschen anhang bleiben.

Code: Alles auswählen

[<span class="main-stats-data-row-data">[u]74,163[/u]</span>, <span class="main-stats-data-row-data">[u]1696h.[/u]</span>, <span class="main-stats-data-row-data">[u]50.3%[/u]</span>, <span class="main-stats-data-row-data">[u]18.9%[/u]</span>, <span class="main-stats-data-row-data">[u]33.1%[/u]</span>, <span class="main-stats-data-row-data">[u]8306[/u]</span>]
Dabei geht es mir um die unterstrichenden "werte", diese würde ich gerne als einzelne variablen haben.
Ich hoffe das ihr mir helfen könnte

Mit freundlichen Grüßen

Parzival
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Parzival: Wo ist denn das konkrete Problem? Du musst halt durch die Liste iterieren und den Text aus den <span>-Tags nehmen – ist ja nicht so als wenn das nicht mit Beispielen in der BS4-Dokumentation beschrieben wird.

Wenn Du Zahlen haben möchtest, musst Du hier und da noch ein bisschen an der Zeichenkette ersetzen, bevor die sich in Zahlen umwandeln lassen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Parzival
User
Beiträge: 4
Registriert: Dienstag 4. Juni 2019, 20:59

wenn ich versuche in einen span reinzukommen kriege ich kein Ergebnis, bzw. die Variable ist leer.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@Parzival: zeig doch den Code, den Du versucht hast. Sollen wir raten, warum Du kein Ergebnis bekommst?
Parzival
User
Beiträge: 4
Registriert: Dienstag 4. Juni 2019, 20:59

ersteinmal danke für die ganzen Antworten,

Hier mein Code bis jetzt:

Code: Alles auswählen

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

for player in steamid:
 	my_url = "https://csgo-stats.com/player/" + str(player)

 	print (my_url)

 	#seite wird runtergeladen und gespeichert
 	uClient = uReq(my_url)
 	page_html = uClient.read()
 	uClient.close()

 	page_soup = soup(page_html, "html.parser")

 	stats = page_soup.findAll("span", {"class":"main-stats-data-row-data"})

 	for stat in enumerate(stats):
 		*stat = stat.replace("<span class="main-stats-data-row-data">","")*
 		print (stat)
die str(player) sind steamID´s.
Jetzt bin ich schon soweit das ich diesen Output habe(ohne: *...*):

Code: Alles auswählen

(0, <span class="main-stats-data-row-data">74,163</span>)
(1, <span class="main-stats-data-row-data">1696h.</span>)
(2, <span class="main-stats-data-row-data">50.3%</span>)
(3, <span class="main-stats-data-row-data">18.9%</span>)
(4, <span class="main-stats-data-row-data">33.1%</span>)
(5, <span class="main-stats-data-row-data">8306</span>)
Nun habe ich gedacht das ich einfach immer die

Code: Alles auswählen

<span class="main-stats-data-row-data">
&
</span>
"rauskürzen" kann um dann meine zahlen habe.
Leider klappt das so garnich. Da krige ich dan diese fehlermeldung:

Code: Alles auswählen

  File "main.py", line 24
    stat = stat.replace("<span class="main-stats-data-row-data">","")
                                         ^
SyntaxError: invalid syntax
Villeicht habt ihr eine andere idee um an die Werte ranzukommen?
Oder könnt mir helfen

Mfg
Parzival
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist der Sinn urlopen in uReq umzubenennen? Funktionen werden per Konvention, wie Variablennamen klein_mit_unterstrich geschrieben. Keine Abkürzungen benutzen, denn das erschwert das Lesen und Verstehen.
Hast Du mal geschaut, welchen Typ `stat` hat? replace kennt ein Tuple jedenfalls nicht.

Auch sollte klar sein, das man keine "-Anführungszeichen verschachteln kann, dafür kennt Python aber 4 verschiedene Arten von Anführungszeichen.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Parzival: Also der Syntaxfehler ist doch eigentlich logisch: Du kannst nicht erwarten das der Rechner " für den Anfang und das Ende einer Zeichenkette verwendet und gleichzeitig dieses Zeichen innerhalb dieser Zeichenkette verwenden.

Letztlich haben die `stat`-Werte aber auch keine `replace()`-Methode, denn das sind `Tag`-Objekte und keine Zeichenketten. Und was für Attribute und Methoden `Tag`-Objekte haben, wird in der `bs4`-Dokumentation mit Beispielen beschrieben.

Beim Importieren solltest Du Dir das umbenennen sparen. `uReq` ist deutlich unverständlicher als `urlopen` und `soup` wird in der Regel ein Exemplat von `BeautifulSoup` genannt und nicht die Klasse selbst. Klassen schreibt man auch nicht klein. Man schreibt aber sonst fast alles klein_mit_unterstrichen. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Dementsprechend sollte man von `BeautifulSoup` auch keine Methoden wie `findAll()` mehr verwenden, die sind veraltet und es gibt konventionell benannte Methoden dafür.

Zwischen Funktion/Methode und der öffnenden Klammer eines Aufrufs gehört kein Leerzeichen.

Zeichenketten und Werte mit ``+`` und `str()` zusammenstückeln ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode, und ab Python 3.6 auch f-Zeichenkettenliterale.

Der Präfix `my_*` ist in aller Regel ganz fürchterlich unsinnig. Wenn es nicht noch `their_url` oder `our_url` gibt, ist `my_*` sinnfrei.

Das Antwortobjekt das `urlopen()` liefert ist ein Kontextmanager, kann also mit ``with`` verwendet werden.

Code: Alles auswählen

#!/usr/bin/env python3
from urllib.request import urlopen

from bs4 import BeautifulSoup


def main():
    # ...
    
    for player in steamid:
        url = f'https://csgo-stats.com/player/{player}'
        print(url)
        with urlopen(url) as response:
            html = response.read()

        soup = BeautifulSoup(html, 'html.parser')
        for stat in soup('span', {'class': 'main-stats-data-row-data'}):
            print(stat)


if __name__ == '__main__':
    main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Parzival
User
Beiträge: 4
Registriert: Dienstag 4. Juni 2019, 20:59

Danke erstmals für die "lösung"
aber nur zum Verständnis für mich wofür ist:

Code: Alles auswählen

if __name__ == '__main__': main()
das verstehe ich noch nicht so richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Parzival: `__name__` hat den Namen des Moduls wenn man es importiert oder den Wert '__main__' wenn man es als Programm ausführt. So kann man das Modul importieren ohne das mehr passiert als die Definition des Modulinhalts. Das macht den Code leichter testbar und wiederverwendbar und einige Werkzeuge die Code analysieren oder Dokumentation aus dem Code ziehen, aber auch Module wie `multiprocessing` erwarten das so.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten