2016-07-19 10 views
0

Ich versuche eine Suche auf Google zu machen und dann den ersten Link zu laden.Wie folgt man den Links zu PyQT4?

ich modifizierten Code einige Beispiel fand ich online:

Dies soll die Suche auf meinem Begriff ‚Stackoverflow‘
class Render(QWebPage): 
    def __init__(self, url): 
    self.app = QApplication(sys.argv) 
    QWebPage.__init__(self) 
    self.loadFinished.connect(self._loadFinished) 
    self.mainFrame().load(QUrl(url)) 
    self.app.exec_() 

    def _loadFinished(self, result): 
    self.frame = self.mainFrame() 
    self.app.quit() 

url = 'https://www.google.com' 
r = Render(url) 
el = r.mainFrame().findFirstElement('input[name=q]') 
el.setAttribute('value', 'stackoverflow') 
button = r.mainFrame().findFirstElement('input[name=btnK]') 

# Now click on the Search button 
button.evaluateJavaScript('this.click()') 

# Print out what we see 
print r.frame.toHtml().toAscii() 

klicken. Aber wenn ich den gedruckten HTML-Code lade, sehe ich nur in der Suchleiste meinen Text, als wäre die Suchschaltfläche noch nicht angeklickt worden.

Wie kann ich auf den Suchknopf klicken, das erste Ergebnis finden und dann die HTML-Quelle dafür ausdrucken?

Antwort

0

Also, ich möchte dies in meinem Kopf klar ... Sie laden die Standard-Google-Seite, die Suche Textfeld auf Ihren Suchbegriff und dann versuchen, einen Klick auf "Suche?" Zu emulieren

Wäre es nicht viel einfacher, direkt auf die Google-Suche zuzugreifen? d. h .:

http://www.google.com/search?q=stackoverflow 

Gibt es einen Grund, warum Sie indirekt über die Webseite tun müssen?

0

Nach ein wenig stochern mit dem Code, fand ich heraus, dass button.isNull()True zurückgibt. Es bedeutet im Grunde, dass es kein Element namens input[name=btnK] gibt. Vielleicht möchten Sie nach dem richtigen Element suchen.

Eine Instanz zu initiieren ist QApplication innerhalb einer Qt-Klasse ist jedoch fraglich und wird nicht empfohlen. Dies kann zu unbekannten/unbekannten Abstürzen führen. Hier können Sie Ihren Code ändern.

class Render(QWebPage): 
    def __init__(self, url): 

     # Init 
     super(QWebPage, Render).__init__(self) 

     # Initial Signal-Slot connection 
     self.loadFinished.connect(self.urlLoadFinished) 

     # If you want to know what's happening 
     sys.stdout.write("Loading %s... " % url) 
     sys.stdout.flush() 

     # Start the load procedure 
     self.mainFrame().load(QUrl(url)) 

    def urlLoadFinished(self, result): 

     # Loading complete 
     print("[DONE]") 

     # You do not want a loop back here once the button is clicked 
     self.loadFinished.disconnect(self.urlLoadFinished) 

     # Get your input element 
     el = self.mainFrame().findFirstElement('input[name=q]') 

     # Fill it with the quesry you want 
     el.setAttribute('value', 'stackoverflow') 

     # Get you Button 
     button = self.mainFrame().findFirstElement('input[name=btnK]') 

     if not button.isNull() : 
      # Connect the loadFinished signal to the final evaluation slot 
      self.loadFinished.connect(self.printEvaluatedOutput) 

      # Now click on the Search button 
      print button.evaluateJavaScript('this.click()') 

     else: 
      print "Button not found" 
      qApp.quit() 

    def printEvaluatedOutput(self) : 

     # Print the contents of the 
     print self.mainFrame().toHtml().toAscii() 

     qApp.quit() 

if __name__ == '__main__' : 

    app = QApplication(sys.argv) 

    renderer = Render('https://www.google.com') 

    sys.exit(app.exec_()) 

EDIT1: Nach etwas mehr stochern, fand ich heraus, dass die Google-Suchtaste mit dem btnG Namen registriert wird, anstatt btnK, wie wir sehen, während die Taste Inspektion. Ersetzen input[name=btnk] von input[name=btnG] tut was Sie wollen.