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