Entschuldigt den Titel. Mir ist da leider nichts besseres eingefallen.
Der untere Code beruht zum Großteil auf dieser Antwort: https://stackoverflow.com/a/37755811.
Der Code ist etwas angepasst, damit einfach eine URL übergeben werden kann.
Leider erhalte ich folgende Ausgabe bzw. Fehlermeldung(?), wenn ich versuche mehrmals den Sourcecode von einer Seite zu laden:
1 2 | Look at you shinin! Segmentation fault |
Erwartet habe ich, dass "Look at you shinin!" zwei Mal ausgegeben wird.
Das ganze soll später auf einem Raspberry Pi ohne grafische Oberfläche laufen. Momentan habe ich einen Server in einer VM laufen und dort wird das Skript getestet, da dort auch keine grafische Oberfläche zur Verfügung steht und mir so hoffentlich auch alle möglichen Fehler wiederfahren.
Ich hoffe, dass es nur eine Kleinigkeit und es somit leicht zu beheben ist. Leider bin ich noch in den Anfängen der Programmierung und weiß jetzt auch nicht mehr, wonach ich im Internet suchen bzw. worauf ich es eingrenzen kann. Bin schon knapp zwei Tage dran und komme mit google einfach nicht mehr vernünftig weiter.
Hier ist noch das komplette Skript, das über "python3 skript.py" aufgerufen wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import sys from PyQt5.QtCore import QEventLoop from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineView from pyvirtualdisplay import Display import bs4 as bs import requests def render(url): """Fully render HTML, JavaScript and all.""" class Render(QWebEngineView): def __init__(self, url): self.html = None self.app = QApplication(sys.argv) QWebEngineView.__init__(self) self.loadFinished.connect(self._loadFinished) self.setHtml(requests.get(url).text) while self.html is None: self.app.processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents) self.app.quit() def _callable(self, data): self.html = data def _loadFinished(self, result): self.page().toHtml(self._callable) return Render(url).html display = Display(visible=0, size=(800, 600)) display.start() seiten = { "python" : "https://pythonprogramming.net/parsememcparseface/", "python2" : "https://pythonprogramming.net/parsememcparseface/" } for name in seiten: page = render(seiten[name]) soup = bs.BeautifulSoup(page, 'lxml') js_test = soup.find('p', class_='jstest') print(str(js_test.text)) |