2012-06-16 111 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中 - 谢谢 –