在Python 3.2中使用HTMLParser

Mil*_*sen 14 arguments html-parsing stripping web-scraping python-3.x

我一直在使用HTML Parser从网站上删除数据并在执行此操作时剥离html编码.我知道各种各样的模块,比如Beautiful Soup,但是决定走不依赖"外部"模块的道路.Eloff提供了一个代码:从Python中的字符串中删除HTML

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()
Run Code Online (Sandbox Code Playgroud)

它适用于Python 3.1.但是,我最近升级到Python 3.2.x并发现我收到有关HTML Parser代码的错误,如上所述.

我的第一个错误指向该行:

s.feed(html)
Run Code Online (Sandbox Code Playgroud)

......错误说......

AttributeError: 'MLStripper' object has no attribute 'strict'
Run Code Online (Sandbox Code Playgroud)

因此,经过一些研究,我在顶线添加"strict = True",使其成为......

class MLStripper(HTMLParser, strict=True)
Run Code Online (Sandbox Code Playgroud)

但是,我得到了新的错误:

TypeError: type() takes 1 or 3 arguments
Run Code Online (Sandbox Code Playgroud)

为了看看会发生什么,我删除了"self"参数并留在"strict = True"中......这放弃了错误:

NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

......我得到了"我猜测猜测"的感觉.

我不知道该class MLStripper(HTMLParser)行中的第三个参数是什么,之后selfstrict=True; 研究没有任何启示.

Tho*_*s K 30

你是子类HTMLParser,但你没有调用它的__init__方法.您需要在方法中添加一行__init__:

def __init__(self):
    super().__init__()
    self.reset()
    self.fed = []
Run Code Online (Sandbox Code Playgroud)

此外,对于Python 3,导入行是:

from html.parser import HTMLParser
Run Code Online (Sandbox Code Playgroud)

通过这些更改,一个简单的示例可行.不要改变class那条不相关的线.

  • 这非常有效,Thomas K.非常感谢你!通过插入"super().__ init __()"代码,脚本再次完美地工作. (2认同)
  • 这也解决了 AttributeError: 'HTMLTagRemover' object has no attribute 'convert_charrefs' super().__init__() 在 Python2 中不是必需的,但在 Python3 中 - 谢谢 (2认同)