如何关注PyQT4的链接?

时间:2016-07-19 20:36:31

标签: python python-2.7 pyqt pyqt4

我正在尝试在Google上进行搜索,然后加载第一个链接。

我修改了一些我在网上找到的示例代码:

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()

这应该点击我的术语'stackoverflow'上的搜索按钮。但是当我加载打印的html时,我只看到搜索栏包含我的文本,就好像尚未点击搜索按钮一样。

如何点击搜索按钮,查找第一个结果,然后打印出html源?

2 个答案:

答案 0 :(得分:0)

所以,我想直截了当地说明......你正在加载默认的谷歌页面,将搜索文本框设置为搜索词,然后尝试模仿点击“搜索?”

直接访问google的搜索会不会更容易?即:

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

是否有某些原因需要通过网页间接进行?

答案 1 :(得分:0)

在对代码稍作讨论后,我发现button.isNull()返回True。它基本上意味着没有名为input[name=btnK]的元素。所以你可能想要搜索正确的元素。

但是,在Qt类中启动实例是QApplication是有问题的,不建议使用。它可能导致未知/无法崩溃。以下是修改代码的方法。

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: 经过一番讨论之后,我发现谷歌的搜索按钮在我检查按钮的过程中注册了btnG而不是btnK。用input[name=btnk]替换input[name=btnG]可以达到你想要的效果。