2016-07-19 2 views
0

Google에서 검색을 수행하고 첫 번째 링크를로드하려고합니다. 이것은 내 용어 '유래'에 대한 검색 버튼을 클릭하도록되어어떻게 PyQT4와 링크를 따라 가나 요?

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

:

나는 내가 온라인으로 발견 된 일부 샘플 코드를 수정했습니다. 그러나 인쇄 된 HTML을로드 할 때 검색 버튼이 아직 클릭되지 않은 것처럼 검색 표시 줄에 내 텍스트가 표시됩니다.

어떻게하면 검색 버튼을 클릭하여 첫 번째 결과를 찾은 다음 html 소스를 출력 할 수 있습니까?

답변

0

그래서 이걸 내 머리 속으로 가져 가고 싶습니다. 기본 Google 페이지를로드하고 검색 텍스트 상자를 검색어로 설정 한 다음 '검색'을 클릭하여 에뮬레이션하려고합니다.

Google 검색에 직접 액세스하는 것이 훨씬 쉽지 않을까요? 예 :

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

웹 페이지를 통해 간접적으로해야하는 이유가 있습니까?

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]으로 바꾸면 원하는대로 처리됩니다.

관련 문제