2010-04-20 243 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