2011-09-07 57 views
0

我正在試圖抓取JavaScript依賴項site。這是一個非常基本的網站,有一個簡單的實際列表(城市名稱,實際上),我不想複製並粘貼到Excel中。該列表是由JavaScript控制的,所以我想我需要使用類似Qt4的東西來模擬瀏覽器,並且我一直在嘗試PySide。使用PySide調用插槽時出錯

我已經開始與一些非常基本的代碼(我已經從here改編):

#!/usr/bin/env python 

import sys 
import signal 
import argparse 

from PySide.QtCore import * 
from PySide.QtGui import * 
from PySide.QtWebKit import QWebPage 


class Crawler(QWebPage): 
def __init__(self, url, file): 
    QWebPage.__init__(self) 
    self._url = url 
    self._file = file 

def crawl(self): 
    signal.signal(signal.SIGINT, signal.SIG_DFL) 
    self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading) 
    self.mainFrame().load(QUrl(self._url)) 

def _finished_loading(self, result): 
    file = open(self._file, 'w') 
    file.write(self.mainFrame().toHtml()) 
    file.close() 
    sys.exit(0) 

def main(): 
    app = QApplication(sys.argv) 
    args = get_args() 
    crawler = Crawler(args.url, args.file) 
    crawler.crawl() 
    sys.exit(app.exec_()) 

def get_args(): 
""" 
Command argument parser 

Returns structure: 
    args.url 
    args.file 
""" 

parser = argparse.ArgumentParser(description='Basic scraper') 
parser.add_argument('-u', '--url', dest='url', help='URL to fetch data from', default='http://www.google.com') 
parser.add_argument('-f','--file', dest='file', help='Local file path to save data to', default='data.txt') 

args = parser.parse_args() 
return args 


if __name__ == '__main__': 
    main() 

問題是,我不知道PySide/Qt4的真的很好。我得到這個錯誤:

Error calling slot "_finished_loading" 

我甚至不知道這是什麼意思。這是否可以解決Qt4和PySide的漫長而艱難的過程?這是一個簡單的修復?

感謝您的所有意見。

回答

1

嘗試使用QApplication.instance().exit()替換sys.exit(0)_finished_loading

0

您沒有將_finished_loading聲明爲插槽。爲此,您需要使用像這樣的@Slot()裝飾器

@Slot(str) 
def _finished_loading(self, result): 
    print(result) 

@Slot(int, int) 
def add(self, a, b): 
    print(a+b) 

等等。裝飾器的參數是預期函數參數的Python數據類型的逗號分隔列表。