如何从类中将数据传递给另一个函数(在HTMLParser中)?
我刚开始学习Python,版本是3.1。
我之前从来没有学过面向对象编程,所以对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)
我得到的是这个:
标题
我是一段文字!
我想把这些数据传递给一个函数,我该怎么做呢?
抱歉我的英语不好,谢谢你的帮助!
2 个回答
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)
祝你学习面向对象编程(OOP)好运!
6
我没有深入研究HTMLParser模块本身,但我注意到feed方法本身会调用handle_data,而在你自己定义的类里,这个方法是用来打印的。@ron的回答建议直接把数据传给你的函数,这样做也是可以的。不过,既然你刚接触面向对象编程(OOP),不妨看看这段代码。
这段代码是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的feed方法。当你调用p.feed(page)
时,它会调用我自己的方法,这个方法会创建一个叫output的实例变量,并把它设置为空列表,然后再调用基类(HTMLParser)里的feed方法,继续执行它正常的操作。通过重写feed方法,我可以做一些额外的事情(增加了一个新的output变量)。handle_data方法也是一个重写的方法。实际上,HTMLParser的handle_data方法根本什么都不做……完全没有任何操作(根据文档的说法)。
所以,简单说一下……
你调用p.feed(page)
,这会调用MyParser.feed方法。
MyParser.feed会把一个变量self.output设置为空列表,然后调用HTMLParser.feed。
handle_data方法会把数据添加到output列表的末尾。
现在你可以通过调用p.output来访问这些数据。