2010-04-20 254 views
3

我试图获得支持,但我完全困惑。扭曲的Python getPage

这里是我的代码:

 

from twisted.internet import reactor 
from twisted.web.client import getPage 
from twisted.web.error import Error 
from twisted.internet.defer import DeferredList 
from sys import argv 

class GrabPage: 
def __init__(self, page): 
    self.page = page 

def start(self, *args): 
    if args ==(): 
    # We apparently don't need authentication for this 
    d1 = getPage(self.page) 
    else: 
    if len(args) == 2: 
    # We have our login information 
    d1 = getPage(self.page, headers={"Authorization": " ".join(args)}) 
    else: 
    raise Exception('Missing parameters') 

    d1.addCallback(self.pageCallback) 
    dl = DeferredList([d1]) 
    d1.addErrback(self.errorHandler) 
    dl.addCallback(self.listCallback) 

def errorHandler(self,result): 
    # Bad thingy! 
    pass 

def pageCallback(self, result): 
    return result 

def listCallback(self, result): 
    print result 

a = GrabPage('http://www.google.com') 
data = a.start() # Not the HTML 

我希望得到的HTML出这是考虑到pageCallback当start()被调用。这对我来说是一个皮塔饼。泰!抱歉我的糟糕的编码。

+0

没有关系,但我知道你为什么要使用双绞线? – 2010-04-20 00:47:57

回答

14

你错过了Twisted如何操作的基础知识。这一切都围绕reactor,你甚至从来没有运行。认为这样的反应器:

Reactor Loop http://krondo.com/blog/wp-content/uploads/2009/07/reactor-1.png

,直到你开始反应器,通过建立deferreds所有你正在做的是没有事件的串联起来,从火。

我建议你给Twisted IntroDave Peticolas一读。它很快,它真的给你所有的扭曲文档没有的信息。

不管怎么说,这里是getPage尽可能最基本的用法例如:

from twisted.web.client import getPage 
from twisted.internet import reactor 

url = 'http://aol.com' 

def print_and_stop(output): 
    print output 
    if reactor.running: 
     reactor.stop() 

if __name__ == '__main__': 
    print 'fetching', url 
    d = getPage(url) 
    d.addCallback(print_and_stop) 
    reactor.run() 

由于getPage返回推迟,我加入了回调print_and_stop到递延链。之后,我开始reactor。反应堆启动getPage,然后启动print_and_stop,打印aol.com的数据,然后停止反应堆。

编辑以显示OP的代码工作的例子:

class GrabPage: 
    def __init__(self, page): 
     self.page = page 
     ########### I added this: 
     self.data = None 

    def start(self, *args): 
     if args ==(): 
      # We apparently don't need authentication for this 
      d1 = getPage(self.page) 
     else: 
      if len(args) == 2: 
       # We have our login information 
       d1 = getPage(self.page, headers={"Authorization": " ".join(args)}) 
      else: 
       raise Exception('Missing parameters') 

     d1.addCallback(self.pageCallback) 
     dl = DeferredList([d1]) 
     d1.addErrback(self.errorHandler) 
     dl.addCallback(self.listCallback) 

    def errorHandler(self,result): 
     # Bad thingy! 
     pass 

    def pageCallback(self, result): 
     ########### I added this, to hold the data: 
     self.data = result 
     return result 

    def listCallback(self, result): 
     print result 
     # Added for effect: 
     if reactor.running: 
      reactor.stop() 

a = GrabPage('http://google.com') 
########### Just call it without assigning to data 
#data = a.start() # Not the HTML 
a.start() 

########### I added this: 
if not reactor.running: 
    reactor.run() 

########### Reference the data attribute from the class 
data = a.data 
print '------REACTOR STOPPED------' 
print 
########### First 100 characters of a.data: 
print '------a.data[:100]------' 
print data[:100] 
+0

反应器已在另一个文件中运行()。这是一个导入的文件。我想我应该提到那一部分。 :x – 2010-04-20 00:40:18

+0

我给你增加了一个简单的例子,我希望这可以帮助你想象它。 – jathanism 2010-04-20 00:44:52

+0

格式我不认为会工作。我也无法打印。它需要是一个回报。因为另一个导入会混淆这个结果。 – 2010-04-20 00:50:34