扭曲的Python getPag

2024-05-18 22:28:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在这件事上得到支持,但我完全糊涂了。

这是我的代码:


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

我想把调用start()时给pageCallback的HTML取出。这对我来说是个陷阱。泰!很抱歉我的编码很烂。


Tags: fromimportselfwebdefpagetwistedargs
1条回答
网友
1楼 · 发布于 2024-05-18 22:28:54

你错过了Twisted操作的基本知识。它都围绕着reactor旋转,你甚至从来没有运行过它。把反应堆想象成这样:

Reactor Loop
(来源:krondo.com

在你启动反应堆之前,通过设置延迟,你所做的一切就是把它们连在一起,而不引发任何事件。

我建议你读一读Twisted Intro。它很快,而且它确实提供了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()

因为getPage返回一个deferred,所以我将回调print_and_stop添加到deferred链中。之后,我启动reactor。反应堆启动getPage,然后启动print_and_stop,打印来自aol.com的数据,然后停止反应堆。

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

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] 

相关问题 更多 >

    热门问题