QWebview getHtml?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Gibt es beim QWebview so eine Funktion die das html des Fensters printed?
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

view = QWebView()
[...]
view.page().mainFrame().toHtml()
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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?
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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_())
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nur am Rande: Sternchen-Importe sind böse *duck* ;-)
simlan
User
Beiträge: 6
Registriert: Montag 20. April 2009, 16:41

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,,,,
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das Widget führt Javascript genauso wie Plug-ins z.B. für Flash aus.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
simlan
User
Beiträge: 6
Registriert: Montag 20. April 2009, 16:41

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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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).
simlan
User
Beiträge: 6
Registriert: Montag 20. April 2009, 16:41

Schönes Beispiel Danke :D
Antworten