Seite 4 von 5
Re: Html Seite einlesen
Verfasst: Sonntag 5. Januar 2020, 19:36
von egon11
@__blackjack__ : OK ich schaue mal nach.
Wenn ich "BeautifulSoup(response.content, 'lxml')" nehme, gibt es da eine Doku?
Re: Html Seite einlesen
Verfasst: Sonntag 5. Januar 2020, 19:51
von __blackjack__
@egon11: Eine Doku wofür?
Re: Html Seite einlesen
Verfasst: Sonntag 5. Januar 2020, 19:57
von egon11
BeautifulSoup mit "lxml"
Re: Html Seite einlesen
Verfasst: Sonntag 5. Januar 2020, 20:03
von snafu
BS funktioniert immer gleich, was ja auch Sinn der Sache ist. Nur das Backend zum Parsen kann halt ausgetauscht werden, wodurch sich neben der Performance auch die Art, wie das HTML-Markup im Detail verarbeitet wird, etwas verändern kann. An der Schnittstelle auf BS-Ebene ändert sich dadurch nichts.
Bezüglich der langen Verarbeitungszeit würde ich an deiner Stelle erstmal messen, wie lange das reine Laden via requests dauert. Die Wahrscheinlichkeit ist hoch, das der Zugang zum Netz einfach recht lahm ist. Und ansonsten kann man es dadurch ja widerlegen und woanders weiter suchen.
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 09:14
von egon11
Jetzt habe ich getestet, an dieser Stelle dauert es ziemlich lange:
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 09:59
von __blackjack__
@egon11: Wie gesagt, an der Stelle sollte man dann "lxml" statt "html.parser" nehmen.
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 10:21
von egon11
__blackjack__ hat geschrieben: ↑Dienstag 7. Januar 2020, 09:59
@egon11: Wie gesagt, an der Stelle sollte man dann "lxml" statt "html.parser" nehmen.
Da fangen schon die nächsten Probleme an.
Wenn ich es über IDLE ausführe geht es, allerdings nicht über Konsole, da wird mir
Code: Alles auswählen
Traceback (most recent call last):
File "/home/prob.py", line 28, in <module>
main()
File "/home/prob.py", line 25, in main
tabelle()
File "/home/prob.py", line 10, in tabelle
html = BeautifulSoup(response.content, 'lxml')
File "/usr/lib/python2.7/site-packages/bs4/__init__.py", line 335, in __init__
u"The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + "\n ".join(other_exceptions)
bs4.builder.ParserRejectedMarkup: The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.
Original exception(s) from parser:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfc in position 600: invalid start byte
LookupError: unknown encoding: 'Windows-1252'
ausgegeben.
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 10:46
von Sirius3
Ja, da stimmt etwas mit dem Encoding nicht. Und die Antwort wird auch gleich gegeben: The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help. Vielleicht hilft auch schon response.text, wenn requests das richtige Encoding weiß.
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 11:33
von egon11
@Sirius3: Das hat funktioniert, jetzt geht es auch auf der konsole.
Nur ich kann dieses Plugin nicht öffnen, obwohl ich `lxml` installiert habe.
Code: Alles auswählen
11:24:42.9942 { } /usr/lib/python2.7/site-packages/twisted/python/util.py:815 untilConcludes 2020-01-07 11:24:42+0100 [-] FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 13:54
von egon11
Jetzt funktioniert es so wie es soll mit `lxml`.
Vielen Dank an alle.
Re: Html Seite einlesen
Verfasst: Dienstag 7. Januar 2020, 14:38
von Sirius3
In `/usr/lib/python2.7/` solltest Du gar nichts ablegen. Was der Fehler mit dem Ort, an dem die py-Datei liegt, ist mir schleierhaft.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 09:58
von egon11
Ich habe es wieder raus genommen. Es läuft,. Danke.
Nur ich verzweifle jetzt an einer Stelle, möchte mir die Ergebnisse anzeigen lassen, aber egal wie ich es filtere kommt nur Müll raus.
Hier mein code:
Code: Alles auswählen
#!/usr/bin/python
### -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
def begegnung():
url = "https://sport.sky.de/bundesliga-spielplan-ergebnisse"
response = requests.get(url)
html = BeautifulSoup(response.text, 'lxml')
klasse = html.find(class_="sdc-site-fixres-wrap")
print(klasse.text.strip())
if __name__=='__main__':
begegnung()
Den seiten Quelltext habe ich mir schon angesehen, aber ich weiß nicht wonach ich es noch filtern soll, damit es einen Sinn ergibt.
Mit den Tabellen hat es immer super funktioniert.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 11:37
von nezzcarth
Das ist ja nun erneut eine andere Seite, wenn ich richtig mitgezählt habe mindestens die dritte. Was ist denn dein konkretes Ziel? Möchtest du alle drei Seiten auswerten, oder wechselst du, weil es bei den anderen Seiten technische Probleme gab?
Die Infos auf dieser Seite jetzt sind auch alle vorhanden und auslesbar. Sie sind nur eben etwas stärker fragmentiert in divs und spans abgelegt. Such nach bestimmten Schlüsselwörtern (zum Beispiel Vereinsnamen) und schau dir an (zum Beispiel mit ctrl+shift+c im Firefox), welches Element im Dom-Tree einer Tabellenzeile entspricht, dann wirst du fündig.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 11:46
von egon11
Die Seite habe ich dann gefunden und für Tabellen sehr gut geeignet. Die soll auch genutzt werden entgültig.
OK ich suche mal nach Dom-Tree.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 12:49
von egon11
Damit wird doch die Klassen gemeint oder? Habe es jetzt mal durchgetestet, aber entweder habe ich nur Vereine oder alles andere, ich dachte man kann es wie in der Tabelle mit einer Liste machen und anschließend verarbeiten.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 12:54
von Sirius3
Was sollten wir dazu sagen, ohne zu wissen, was Du jetzt gemacht hast?
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 13:31
von egon11
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
def begegnung():
url = "https://sport.sky.de/bundesliga-spielplan-ergebnisse"
response = requests.get(url)
html = BeautifulSoup(response.text, 'lxml')
for klasse in html.find_all(class_="sdc-site-fixres__team-name"):
print(klasse.text)
if __name__=='__main__':
begegnung()
Ziel soll ja sein das Spiel in einer Zeile anzuzeigen.
Im code (firefox strg + shift + c) sagt mir nichts mehr aus, als wenn ich den Quelltext öffne.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 13:38
von Sirius3
Eine Zeile hat die Klasse `sdc-site-fixres__match`. Und die Spalten haben die Klassen sdc-site-fixres__match-cell--hometeam, sdc-site-fixres__match-cell--score und sdc-site-fixres__match-cell--awayteam.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 18:49
von egon11
Warum ist der Ansatz falsch:
Code: Alles auswählen
def begegnung():
url = "https://sport.sky.de/bundesliga-spielplan-ergebnisse"
response = requests.get(url)
html = BeautifulSoup(response.text, 'lxml')
liste = []
alles = ""
for text in html.find_all(class_="sdc-site-fixres-wrap"):
for i in text.find_all(class_="sdc-site-fixres__header2"):
print(i.text)
for team in i.find_all(class_="sdc-site-fixres__match-cell sdc-site-fixres__match-cell--hometeam"):
print(team.text)
Das script wird beim ersten schon beendet
Habe das BeautifulSoup schon 3x durchgearbeitet.
Re: Html Seite einlesen
Verfasst: Sonntag 12. Januar 2020, 19:02
von Sirius3
Falsch ist, dass Du ein HTML-Element `text` nennst, noch viel fälscher ist es eins `i` zu nennen. Und wieso glaubst Du, dass Deine Klassen besser wären als mein?