我正在尝试在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源?
答案 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]
可以达到你想要的效果。