我正在努力抓取一个依赖JavaScript的site。这是一个非常基本的网站,有一个简单的entires列表(实际上是城市名称),我不想复制并粘贴到Excel中。该列表由javascript控制,所以我想我需要使用类似Qt4的东西来模拟浏览器,我一直在尝试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吗?这是一个简单的解决方法吗?
感谢所有输入。
答案 0 :(得分:1)
尝试使用sys.exit( 0 )
替换_finished_loading
中的QApplication.instance().exit()
。
答案 1 :(得分: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数据类型列表。