【问题标题】:How to pass data to another function from a class (in HTMLParser)?如何将数据从类(在 HTMLParser 中)传递给另一个函数?
【发布时间】:2011-01-12 04:53:30
【问题描述】:

我开始学习python。我的python版本是3.1

我以前从未学过 OOP, 所以我对 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)

我会得到这个:

标题

我是一个段落!

我想将此数据传递给函数,我该怎么办?

对不起,我的英语很差,感谢您的帮助!

【问题讨论】:

    标签: python class function


    【解决方案1】:

    我没有查看 HTMLParser 模块本身,但我可以看到提要固有地调用 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 方法,我能够做一些额外的事情(添加了一个新的输出变量)。 handle_data 方法同样是一种覆盖方法。事实上,HTMLParser 的 handle_data 方法甚至什么都不做……什么都没有(根据文档。)

    所以,只是为了澄清......

    你调用 p.feed(page) 调用 MyParser.feed 方法 MyParser.feed 将变量 self.output 设置为空列表,然后调用 HTMLParser.feed handle_data 方法将该行添加到输出列表的末尾。

    您现在可以通过调用 p.output 访问数据。

    【讨论】:

    • 您的解释非常清楚。这应该在教科书上。非常感谢!我正要向罗恩给出我接受的答案,因为你的分数比他的高。但既然你的答案太好了,可能对其他人有帮助,我想我应该给你接受的答案
    【解决方案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 好运!

    【讨论】:

    • 还应该稍后检查 lxml (codespeak.net/lxml) 以清理真实世界的 html。或 BeautifoulSoup 等替代品。
    • 谢谢!你的回答真的很有帮助。但我还是想知道:parser.feed("html file") 是从一个func0调用的,func0如何获取解析器生成的数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多