2013-10-06 6 views
5

Ho avuto l'impressione che l'utilizzo di un'implementazione browser headless del webkit usando PyQT mi procurasse automaticamente il codice html per ogni URL anche con un pesante codice JS. Ma lo vedo solo parzialmente. Mi sto confrontando con la pagina che ottengo quando salvi la pagina dalla finestra di firefox.La pagina HTML è molto diversa quando si utilizza un'implementazione del webkit headless usando PyQT

Sto usando il seguente codice -

class JabbaWebkit(QWebPage): 
    # 'html' is a class variable 

    def __init__(self, url, wait, app, parent=None): 
     super(JabbaWebkit, self).__init__(parent) 
     JabbaWebkit.html = '' 

     if wait: 
      QTimer.singleShot(wait * SEC, app.quit) 
     else: 
      self.loadFinished.connect(app.quit) 

     self.mainFrame().load(QUrl(url)) 

    def save(self): 
     JabbaWebkit.html = self.mainFrame().toHtml() 

    def userAgentForUrl(self, url): 
     return USER_AGENT 


    def get_page(url, wait=None): 
     # here is the trick how to call it several times 
     app = QApplication.instance() # checks if QApplication already exists 

     if not app: # create QApplication if it doesnt exist 
      app = QApplication(sys.argv) 
     # 
     form = JabbaWebkit(url, wait, app) 
     app.aboutToQuit.connect(form.save) 
     app.exec_() 
     return JabbaWebkit.html 

qualcuno può vedere nulla ovviamente sbagliato con il codice?

Dopo aver eseguito il codice attraverso alcuni URL, qui è quella che ho trovato che mostra i problemi che sono in esecuzione in abbastanza chiaramente - http://www.chilis.com/EN/Pages/menu.aspx

Grazie per tutti i puntatori.

+0

uso phantom.js. È meglio per questo tipo di lavoro. – BigSack

risposta

1

La pagina ha un codice Ajax, al termine del caricamento, ha ancora bisogno di tempo per aggiornare la pagina con Ajax. Ma il tuo codice si chiuderà quando finirà il caricamento.

dovreste aggiungere un certo codice come questo attendere alcuni eventi di tempo e di processo in WebKit:

for i in range(200): #wait 2 seconds 
    app.processEvents() 
    time.sleep(0.01) 
Problemi correlati