Seite 1 von 1

QWebview getHtml?

Verfasst: Dienstag 22. September 2009, 15:05
von INFACT
Gibt es beim QWebview so eine Funktion die das html des Fensters printed?

Verfasst: Dienstag 22. September 2009, 15:49
von snafu

Code: Alles auswählen

view = QWebView()
[...]
view.page().mainFrame().toHtml()

Verfasst: Dienstag 22. September 2009, 16:04
von INFACT

Code: Alles auswählen

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

app = QApplication(sys.argv)

web = QWebView()
web.load(QUrl("http://www.python-forum.de/topic-20308.html"))
web.show()
x = open("test.html", "w")
print "debug"
x.write(web.page().mainFrame().toHtml())
print "end"
sys.exit(app.exec_())
Führt bei mir zu einer leeren datei.
Wie geht das denn?

Verfasst: Dienstag 22. September 2009, 16:21
von snafu
Du musst das loadFinished()-Signal abwarten, bevor du auf den kompletten DOM-Tree zugreifen kannst. Anders gesagt: In dem Moment, wo du das toHtml() machst ist noch gar kein Inhalt da.

Verfasst: Dienstag 22. September 2009, 17:55
von INFACT

Code: Alles auswählen

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *


class P_MainWindow(QWebView):
    def __init__(self, parent = None):
        QWebView.__init__(self, parent)

        self.load(QUrl("http://www.python-forum.de/topic-20308.html"))
        
        self.connect(self, SIGNAL("loadFinished(bool)"),
                     self.print_html)

        print "OK!"
    def print_html(self):
        x = open("test.html", "w")
        x.write(self.page().mainFrame().toHtml())
        print "OK"

app = QApplication(sys.argv)
w = P_MainWindow()
w.show()
sys.exit(app.exec_())

Verfasst: Dienstag 22. September 2009, 18:40
von snafu
Das schreibt jetzt auf doof in die Datei, ohne dass du weißt, ob der Aufruf der Seite erfolgreich war. Unter Umständen ist dein Inhalt nämlich nur `<html></html>`, da Qt sich bei einem Fehler (unbekannte Url, anderes Problem beim Laden) nicht von selbst meldet und dir einen leeren DOM-Tree zurückgibt.

Übrigens bist du nicht gezwungen, das Widget mit show() zu zeigen, denn es klappt ohne genau so. Wenn du also nur daran interessiert bist, mit der WebKit-Engine an den Seiten-Inhalt zu kommen, empfiehlt es sich vielleicht, das weg zu lassen. Beenden kann man Qt nämlich auch mit app.quit(). Das könntest du dann einfach ans Ende deines Callbacks setzen, wenn du willst.

Spätestens dann sollte man aber wohl wirklich ein bißchen was am Error-Handling machen.

Verfasst: Dienstag 22. September 2009, 18:46
von Hyperion
Nur am Rande: Sternchen-Importe sind böse *duck* ;-)

Verfasst: Freitag 25. September 2009, 16:28
von simlan
Kann das Webkit Widget auch Java Script ausführen? Oder ist das nur ein Aufgemotzter Html Parser?

Habe mal ne Zeit lang nach sowas gesucht,,,,

Verfasst: Freitag 25. September 2009, 16:55
von DasIch
Das Widget führt Javascript genauso wie Plug-ins z.B. für Flash aus.

Verfasst: Freitag 25. September 2009, 17:59
von snafu
@simlan: Der Sinn, WebKit in dieser Weise zu "missbrauchen", ist meist, dass man an das HTML kommen will, welches ein normaler Browser sehen würde. Und ein Browser sieht oft was anderes als die `urllib` von Python.

Deshalb lädt man die Seite einfach in einem "echten" Browser-Fenster, nur zeigt es dem Anwender nicht, falls dieser sich nur für den Seiten-Inhalt interessiert. Also zumindest wenn man das nach meinem Vorschlag macht. Wenn man innerhalb eines Programms einen Menüpunkt hat oder so, ist das natürlich was anderes. Logo.

Verfasst: Freitag 25. September 2009, 22:25
von simlan
snafu hat geschrieben:@simlan: Der Sinn, WebKit in dieser Weise zu "missbrauchen", ist meist, dass man an das HTML kommen will, welches ein normaler Browser sehen würde. Und ein Browser sieht oft was anderes als die `urllib` von Python.

Deshalb lädt man die Seite einfach in einem "echten" Browser-Fenster, nur zeigt es dem Anwender nicht, falls dieser sich nur für den Seiten-Inhalt interessiert. Also zumindest wenn man das nach meinem Vorschlag macht. Wenn man innerhalb eines Programms einen Menüpunkt hat oder so, ist das natürlich was anderes. Logo.
Genau darum ging es mir :) Hab schon viel probiert aber das scheint ne saubere Sache zu sein nicht so ein einziger Workaround wie PyGTkWebkit...
Wenn ich dann irgendwann OOP auf die Reihe kriege läuft das sicher besser.


Danke Leute :!:

BTW: Immer Schade wenn keine aktuellen Packete in Repo der Distro sind ...immer dieses gefrikel

Verfasst: Samstag 26. September 2009, 10:02
von snafu
Das geht auch ohne OOP. Ich hab hier mal ganz simples Skript gemacht, das die Ausgabe ins Terminal schreibt (lauffähig ab PyQt 4.4).

Verfasst: Montag 28. September 2009, 11:23
von simlan
Schönes Beispiel Danke :D