pyqt4 seg ошибка последовательная остановка запуска приложения - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь читать веб-страницы, используя pyqt.Мне нужно вызывать метод несколько раз с разными URL.В настоящее время я использую код, похожий на: http://blog.sitescraper.net/2010/06/scraping-javascript-webpages-in-python.html#comment-form

Однако, когда я пытаюсь, я получаю ошибки seg.Любые предложения приветствуются.

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'

1 Ответ

1 голос
/ 05 августа 2011

PyQt часто забывает хранить ссылки на объекты. Обходные:

  • Попробуйте использовать PySide вместо PyQt, это легко, поскольку API почти полностью совпадает с PyQt. Сначала я бы попробовал PySide, он мог бы решить вашу проблему немедленно или, по крайней мере, сделать ее предсказуемой и воспроизводимой.

  • Постарайтесь сохранить ссылки на все объекты Qt, которые вы используете, и удалите эти ссылки, когда вы закончите с объектами. Вы также можете попробовать явно закрыть их или перейти к «about: blank» перед переходом на следующую веб-страницу.

Обычно это помогает. Если нет, то вам нужно сузить его, как утдемир предложил выше. Отладка обычно не помогает, так как такие проблемы часто связаны со временем. Ведение журнала без выходного буфера обычно помогает приблизиться к источнику проблемы.

Я с тобой в душе, такие проблемы трудно отследить!

...