2011-08-04 2 views
0

pyqt를 사용하여 웹 페이지를 읽으려고합니다. 다른 URL을 사용하여 메서드를 여러 번 호출해야합니다. 현재 다음과 유사한 코드를 사용하고 있습니다. http://blog.sitescraper.net/2010/06/scraping-javascript-webpages-in-python.html#comment-formpyqt4 seg 오류 순차적 앱 시작 중지

그러나 시도 할 때 seg faults가 발생합니다. 어떤 제안이라도 환영합니다.

import sys 

from time import clock 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
from PyQt4.QtWebKit import * 
from PyQt4.QtNetwork import * 

class Render(QWebPage): 
    def __init__(self): 
    self.app = QApplication(sys.argv) 
    QWebPage.__init__(self) 

    self.networkAccessManager().finished.connect(self.handleEnd) 
    self.loadFinished.connect(self._loadFinished) 

    self.mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff) 
    self.mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff) 

    def loadURL(self, url): 
    self.mainFrame().load(QUrl(url)) 
    self.app.exec_() 

    def savePageImage (self, width, height, Imagefile): 
    pageSize = self.mainFrame().contentsSize(); 
    if width == 0: 
     pageWidth = pageSize.width() 
    else: 
     pageWidth = width 
    if height == 0: 
     pageHeight = pageSize.height() 
    else: 
     pageHeight = height 

    self.setViewportSize(QSize(pageWidth, pageHeight)) 
    Img = QImage(self.viewportSize(), QImage.Format_ARGB32) 
    painter = QPainter(Img) 
    self.mainFrame().render(painter) 
    painter.end() 
    Img.save(Imagefile) 


    def _loadFinished(self, result): 
    print "load finish" 
    self.frame = self.mainFrame() 
    self.returnVal = result 
    self.app.quit() 

    def handleEnd (self, reply): 
    # get first http code and disconnect 
    # could add filter to listen relevant responses 
    self.httpcode = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) 
    self.networkAccessManager().finished.disconnect(self.handleEnd) 


jsrurl = 'http://www.w3resource.com/javascript/document-alert-confirm/four.html' 
badurl='something.or.other' 
badhttp = 'http://eclecticself.com/test2.html' 
testurl = 'http://www.nydailynews.com/entertainment/index.html' 
testurl2 = 'http://www.palmbeachpost.com/' 
testurl3 = 'http://www.nydailynews.com/news/politics/2011/08/03/2011-08-03_pat_buchanan_downplays_controversy_after_calling_president_obama_your_boy_to_rev.html' 
url = testurl 



start = clock() 
r = Render() 
r.loadURL(url) 
html = r.frame.toHtml() 
elapsed = clock() - start 
print elapsed 

if (r.returnVal == True): 
    if (r.httpcode.toInt()[0] != 404): 
     #print html.toUtf8() 
     start = clock() 
     r.savePageImage(1024, 0, "pageSnapshot.png") 
     elapsed = clock() - start 
     print elapsed 
    else: 
     print 'page not found' 
else: 
    print 'badurl' 

s = Render() 
s.loadURL(jsrurl) 
html = s.frame.toHtml() 
elapsed = clock() - start 
print elapsed 
if (s.returnVal == True): 
    if (s.httpcode.toInt()[0] != 404): 
     print html.toUtf8() 
     start = clock() 
     s.savePageImage(1024, 0, "pageSnapshot.png") 
     elapsed = clock() - start 
     print elapsed 
    else: 
     print 'page not found' 
else: 
    print 'badurl' 
+0

어디에서나 인쇄 명령문을 쓰고 실제로 segfault를 얻은 곳을 찾으십시오. 나는 QApplication 초기화를 의심하고있다. – utdemir

+0

디버깅을 시도 했습니까? – BrainStorm

+0

예, 이유가 없습니다. – user879422

답변

1

PyQt는 종종 객체에 대한 참조를 잊어 버리는 경우가 많습니다. 해결 방법 :

  • 시도 대신에 PyQt는의 PySide를 사용할 수있는 API가 거의 완전하게 PyQt는 동일하므로, 그것은 간단합니다. 나는 먼저 PySide를 시도 할 것이고, 그것은 당신의 문제를 즉시 해결할 수도 있고 적어도 예측 가능하고 재사용 가능하게 만들 수도있다.

  • 사용중인 모든 Qt 객체에 대한 참조를 유지하고 객체가 완료되면 해당 참조를 제거하십시오. 또한 명시 적으로 닫거나 다음 웹 페이지로 이동하기 전에 "about : blank"로 이동할 수 있습니다.

일반적으로 도움이됩니다. 그렇지 않다면 utdemir이 위의 제안대로 범위를 좁힐 필요가 있습니다. 디버깅은 대개 도움이되지 않습니다. 이러한 문제는 종종 타이밍과 관련되기도합니다. 출력 버퍼가없는 로깅은 대개 문제의 원인에 더 가깝게하는 데 도움이됩니다.

저는 영혼 속에서 당신과 함께 있습니다. 그런 문제는 추적하기가 어렵습니다!

+0

같은 결과를 PySide 시도. 기본적으로 다시 시작하는 앱보다 앱을 종료하고 싶습니다. – user879422