2012-06-16 96 views
12

我一直在使用HTML Parser從網站上刪除數據並剝離html編碼。我知道各種模塊,比如美麗的湯,但是決定走上不依賴於「外部」模塊的道路。有一個由Eloff提供的代碼:Strip HTML from strings in Python在Python 3.2中使用HTMLParser

from HTMLParser import HTMLParser 

class MLStripper(HTMLParser): 
    def __init__(self): 
     self.reset() 
     self.fed = [] 
    def handle_data(self, d): 
     self.fed.append(d) 
    def get_data(self): 
     return ''.join(self.fed) 

def strip_tags(html): 
    s = MLStripper() 
    s.feed(html) 
    return s.get_data() 

它在Python 3.1中起作用。不過,我最近升級到了Python 3.2.x,並發現我在上面編寫的HTML解析器代碼中遇到了錯誤。

我的第一個錯誤點到線:

s.feed(html) 

...和錯誤說...

AttributeError: 'MLStripper' object has no attribute 'strict' 

因此,一些研究之後,我添加了「嚴=真「來頂線,使得它...

class MLStripper(HTMLParser, strict=True) 

不過,我得到的新的錯誤:

TypeError: type() takes 1 or 3 arguments 

,看看會發生什麼,我刪除了「自我」的說法,並在「嚴=真」 ......這給了錯誤左:

NameError: global name 'self' is not defined 

...和我「我猜猜猜」的感覺。

我不知道class MLStripper(HTMLParser)行中的第三個參數是selfstrict=True之後的第三個參數;研究並沒有拋棄任何啓示。

回答

20

您正在繼承HTMLParser,但您並未調用其方法__init__。你需要一個行添加到您__init__方法:

def __init__(self): 
    super().__init__() 
    self.reset() 
    self.fed = [] 

此外,爲Python 3,進口線爲:

from html.parser import HTMLParser 

有了這些變化,一個簡單的例子工程。不要更改class行,這是不相關的。

+2

非常完美,Thomas K.非常感謝!插入的是「super().__ init __()」代碼,腳本再次正常工作。 – MilesNielsen

+0

這也解決了 AttributeError:'HTMLTagRemover'對象沒有屬性'convert_charrefs' super().__ init __()在Python2中對我來說不是必需的,但是在Python3中 - 謝謝 –