2010-02-02 3 views
4

Je commence à apprendre Python. Ma version de python est 3.1Comment passer des données à une autre fonction d'une classe (dans HTMLParser)?

Je n'ai jamais appris la POO auparavant, alors je suis confus par le HTMLParser.

from html.parser import HTMLParser 
class parser(HTMLParser): 
def handle_data(self, data): 
     print(data) 

p = parser() 
page = """<html><h1>title</h1><p>I'm a paragraph!</p></html>""" 
p.feed(page) 

Je vais ceci:

titre

Je suis un paragraphe!

Je souhaite que ces données soient transmises à une fonction, que dois-je faire? Désolé pour mon anglais pauvre et merci pour votre aide!

Répondre

5

Je n'ai pas regardé le module HTMLParser lui-même, mais je peux voir que le flux appelle de manière inhérente handle_data, qui dans votre classe dérivée effectue une impression. La réponse de @ ron suggère de passer directement les données à votre fonction, ce qui est totalement OK. Cependant, puisque vous êtes nouveau à la POO, jetez un coup d'oeil à ce code.

Ceci est Python, 2.x, mais je pense que la seule chose qui changerait est l'emplacement du paquet, html.parser au lieu de HTMLParser.

from HTMLParser import HTMLParser 

class MyParser(HTMLParser): 
    def handle_data(self, data): 
     self.output.append(data) 
    def feed(self, data): 
     self.output = [] 
     HTMLParser.feed(self, data) 


p = MyParser() 
page = """<html><h1>title</h1><p>I'm a paragraph!</p></html>""" 
p.feed(page) 

print p.output 

output 
['title', "I'm a paragraph!"] 

Ici, je remplace la méthode d'alimentation de HTMLParser. Au lieu de cela, lorsque l'appel est fait p.feed(page), il appelle ma méthode, qui crée/définit une variable d'instance appelée sortie dans une liste vide, puis appelle la méthode de flux dans la classe de base (HTMLParser) et poursuit ce qu'elle fait normalement. Donc, en surchargeant la méthode d'alimentation, j'ai été capable de faire quelques trucs supplémentaires (ajouté une nouvelle variable de sortie). La méthode handle_data est pareillement une méthode de substitution. En fait, la méthode handle_data de HTMLParser n'a même rien fait ... rien du tout (selon les docs.)

Alors, juste pour préciser ...

Vous appelez p.feed(page) qui appelle la MyParser La méthode .feed MyParser.feed définit une variable self.output et vide la liste puis appelle HTMLParser.feed La méthode handle_data ajoute la ligne à la fin de la liste de sortie.

Vous avez maintenant accès aux données via un appel à p.output.

+0

Votre explication est incroyablement claire. Cela devrait être dans le manuel. Merci beaucoup! Je suis sur le point de donner ma réponse acceptée à Ron parce que ton score est plus élevé que le sien. Mais puisque votre réponse est si bonne qu'elle peut aider les autres, je pense que je devrais vous donner la réponse acceptée – zjk

2

Juste un exemple:

def my_global_fun(data): 
    print "processing", data 

class parser(HTMLParser): 
    def my_member_fun(self, data): 
     print "processing", data 

    def handle_data(self, data): 
     self.my_member_fun(data) 
     # or 
     my_global_fun(data) 

Bonne chance apprendre POO!

+0

Devrait également vérifier lxml (http://codespeak.net/lxml/) plus tard pour l'assainissement du monde réel html. Ou des alternatives comme BeautifoulSoup, etc. – ron

+0

Merci! Votre réponse m'a beaucoup aidé. mais je me demande encore: parser.feed ("fichier html") est appelé à partir d'un func0, comment func0 peut-il obtenir les données générées par l'analyseur? – zjk

Questions connexes