2010-04-20 4 views
3

J'ai essayé d'obtenir de l'aide à ce sujet, mais je suis totalement confus.Twisted Python getPage

Voici mon code:

 

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 

Je souhaite obtenir le code HTML sur qui est donnée à pageCallback lorsque le démarrage() est appelée. Cela a été un pita pour moi. Ty! Et désolé pour mon codage sucky.

+0

pas liés, mais je sais peut pourquoi vous utilisez tordu? –

Répondre

14

Vous manquez les bases du fonctionnement de Twisted. Tout tourne autour du reactor, que vous n'utilisez même pas. Pensez au réacteur comme celui-ci:

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

Jusqu'à ce que vous démarrez le réacteur, en mettant en place deferreds tout ce que vous faites est les enchaînant sans événements dont le feu. Je recommande que vous donniez le Twisted Intro par Dave Peticolas une lecture. C'est rapide et cela vous donne vraiment toutes les informations manquantes que la documentation Twisted n'a pas.

Quoi qu'il en soit, voici l'exemple d'utilisation les plus élémentaires de getPage possible:

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() 

Depuis getPage retourne un différé, j'ajoute le rappel print_and_stop à la chaîne différée. Après cela, je commence le reactor. Le réacteur déclenche getPage, qui déclenche alors print_and_stop qui imprime les données de aol.com et arrête le réacteur.

Modifier pour afficher un exemple de travail de code 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

Le réacteur était déjà exécuté() dans un autre fichier. Ceci est un fichier importé. Je suppose que je devrais mentionner cette partie. : x –

+0

J'ai ajouté un exemple simple pour vous, j'espère que cela pourrait vous aider à le visualiser. – jathanism

+0

Le format que je ne pense pas fonctionnera. Je ne peux pas l'imprimer non plus. Cela doit être un retour. Parce qu'une autre importation va gâcher avec le résultat de ceci. –