2010-02-02 44 views
4

我開始學習python。我的蟒蛇版本是3.1如何將數據傳遞給類中的另一個函數(在HTMLParser中)?

我從來沒有學過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) 

我會得到這樣的:

標題

我一個段落!

我想把這個數據傳遞給一個函數,我該怎麼辦?

對不起,我英文很差,謝謝你的幫助!

回答

5

我沒有看看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的提要方法。相反,當調用p.feed(page)時,它會調用我的方法,該方法創建/設置一個名爲output的實例變量爲空列表,然後調用基類(HTMLParser)中的提要方法並繼續執行正常工作。所以,通過重寫feed方法,我可以做一些額外的東西(添加一個新的輸出變量)。 handle_data方法同樣是一個重寫方法。事實上,的HTMLParser的handle_data方法甚至沒有(根據文檔。)做任何事......什麼都沒有

所以,我只想澄清......

你叫p.feed(page)它調用MyParser .feed方法 MyParser.feed將變量self.output設置爲空列表,然後調用HTMLParser.feed handle_data方法將該行添加到輸出列表的末尾。

您現在可以通過調用p.output來訪問數據。

+0

你的解釋令人難以置信的清晰。這應該在教科書中。非常感謝!我正準備把我接受的答案給予羅恩,因爲你的分數比他高。但既然你的答案很好,可以幫助別人,我想我應該給你接受的答案 – zjk 2010-02-02 16:25:49

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!

+0

稍後還應該查看lxml(http://codespeak.net/lxml/)以清理真實世界的html。或者像BeautifoulSoup等替代品 – ron 2010-02-02 15:15:59

+0

謝謝!你的回答確實幫了很大忙。 但我還在想: parser.feed(「html文件」)是從func0調用的,func0如何獲取解析器生成的數據? – zjk 2010-02-02 15:29:42

相關問題