2010-02-02 3 views
4

Я начинаю изучать питон. Моя версия python равна 3,1Как передать данные другой функции из класса (в HTMLParser)?

Я никогда не изучал ООП до, , поэтому я смущен 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) 

Я получаю это:

название

Я абзац!

Я хочу, чтобы эти данные передавались функции, что мне делать?

Извините за моего бедного английского и благодарю вас за помощь!

ответ

5

Я не рассматривал сам модуль HTMLParser, но я вижу, что этот канал по сути вызывает handle_data, который в вашем производном классе выполняет печать. Ответ @ ron предлагает передать данные непосредственно вашей функции, что вполне нормально. Однако, поскольку вы новичок в ООП, можете взглянуть на этот код.

Это Python, 2.x, но я думаю, что единственное, что изменилось, это расположение пакета html.parser вместо 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!"] 

Здесь я переопределяю метод подачи HTMLParser. Вместо этого, когда вызов сделан p.feed(page), он вызовет мой метод, который создает/задает переменную экземпляра с именем output в пустой список, а затем вызывает метод feed в базовом классе (HTMLParser) и продолжает то, что он делает нормально. Таким образом, переопределив метод подачи, я смог сделать некоторые дополнительные вещи (добавил новую выходную переменную). Метод handle_data аналогичным образом является методом переопределения. В самом деле, метод handle_data из HTMLparser не даже и не делать ничего ... вообще ничего (по документации).

Так, просто для уточнения ...

Вы называете p.feed(page), который вызывает MyParser .feed метод MyParser.feed устанавливает переменную self.output и пустой список, а затем вызывает HTMLParser.feed Метод handle_data добавляет строку в конец выходного списка.

Теперь у вас есть доступ к данным по вызову p.output.

+0

Ваши объяснения невероятно ясны. Это должно быть в учебнике. Большое спасибо! Я собираюсь дать свой ответ Рон, потому что ваш счет выше его. Но поскольку ваш ответ настолько хорош, что он может помочь другим, я думаю, что я должен дать вам принятый ответ – zjk

2

Просто пример:

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) 

Удачи обучения ООП!

+0

Должен также проверить lxml (http://codespeak.net/lxml/) позже для дезинфекции реального мира html. Или альтернативы, такие как BeautifoulSoup и т. Д. – ron

+0

Спасибо! Ваш ответ очень помог. , но мне все еще интересно: parser.feed ("html file") вызывается из func0, как func0 может получить данные, сгенерированные парсером? – zjk

Смежные вопросы