如何从类中将数据传递给另一个函数(在HTMLParser中)?

4 投票
2 回答
1736 浏览
提问于 2025-04-15 18:47

我刚开始学习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来访问这些数据。

撰写回答