Twisted Python getPage

Dav*_*xon 4 python twisted

我试图得到这方面的支持,但我完全糊涂了.

这是我的代码:


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
Run Code Online (Sandbox Code Playgroud)

我希望在调用start()时获取给予pageCallback的HTML.这对我来说是一个皮塔饼.泰!对不起我的sucky编码.

jat*_*ism 14

你错过了Twisted如何运作的基础知识.这一切都围绕着reactor你,你甚至从未运行过.想想反应堆是这样的:

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

在你启动反应堆之前,通过设置延迟,你所做的就是将它们链接起来,没有可以触发的事件.

我建议你给扭介绍戴夫Peticolas读.它很快,它确实为您提供了Twisted文档所没有的所有缺失信息.

无论如何,这是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()
Run Code Online (Sandbox Code Playgroud)

由于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] 
Run Code Online (Sandbox Code Playgroud)