Seite 1 von 1
mit Beautifulsoup span auslesen.
Verfasst: Dienstag 4. Juni 2019, 21:07
von Parzival
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
Re: mit Beautifulsoup span auslesen.
Verfasst: Dienstag 4. Juni 2019, 21:52
von __blackjack__
@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.
Re: mit Beautifulsoup span auslesen.
Verfasst: Mittwoch 5. Juni 2019, 06:01
von Parzival
wenn ich versuche in einen span reinzukommen kriege ich kein Ergebnis, bzw. die Variable ist leer.
Re: mit Beautifulsoup span auslesen.
Verfasst: Mittwoch 5. Juni 2019, 06:22
von Sirius3
@Parzival: zeig doch den Code, den Du versucht hast. Sollen wir raten, warum Du kein Ergebnis bekommst?
Re: mit Beautifulsoup span auslesen.
Verfasst: Mittwoch 5. Juni 2019, 21:10
von Parzival
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
"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
Re: mit Beautifulsoup span auslesen.
Verfasst: Mittwoch 5. Juni 2019, 21:24
von Sirius3
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.
Re: mit Beautifulsoup span auslesen.
Verfasst: Mittwoch 5. Juni 2019, 21:33
von __blackjack__
@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()
Re: mit Beautifulsoup span auslesen.
Verfasst: Donnerstag 6. Juni 2019, 07:50
von Parzival
Danke erstmals für die "lösung"
aber nur zum Verständnis für mich wofür ist:
das verstehe ich noch nicht so richtig.
Re: mit Beautifulsoup span auslesen.
Verfasst: Donnerstag 6. Juni 2019, 09:33
von __blackjack__
@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.