在 Python 3.2 中使用 HTMLParser

Posted

技术标签:

【中文标题】在 Python 3.2 中使用 HTMLParser【英文标题】:Using HTMLParser in Python 3.2 【发布时间】:2012-06-19 03:16:44 【问题描述】:

我一直在使用 html Parser 从网站上抓取数据并在此过程中剥离 html 编码。我知道各种模块,例如 Beautiful Soup,但决定走不依赖“外部”模块的道路。 Eloff 提供了一个代码:Strip HTML from strings in Python

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 Parser 代码出现错误。

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

s.feed(html)

...错误提示...

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

所以,经过一番研究,我将“strict=True”添加到顶行,使其...

class MLStripper(HTMLParser, strict=True)

但是,我收到以下新错误:

TypeError: type() takes 1 or 3 arguments

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

NameError: global name 'self' is not defined

...我得到了“我在猜测”的感觉。

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

【问题讨论】:

【参考方案1】:

您正在继承 HTMLParser,但您没有调用它的 __init__ 方法。您需要在__init__ 方法中添加一行:

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

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

from html.parser import HTMLParser

有了这些改变,一个简单的例子就可以工作了。不要更改class 行,这不相关。

【讨论】:

效果很好,Thomas K。非常感谢!插入“super().__init__()”代码后,脚本再次完美运行。 这也解决了 AttributeError: 'HTMLTagRemover' object has no attribute 'convert_charrefs' super().__init__() 在 Python2 中对我来说不是必需的,但在 Python3 中是必需的 - 谢谢

以上是关于在 Python 3.2 中使用 HTMLParser的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Java抓取网页上指定部分的内容

在 Python 3.2 中使用 MFC .dll 文件

在 Python 3.2 中使用 HTMLParser

使用 python_requires 要求 Python 2.7 或 3.2+

如何在 Python 3.2 或更高版本中使用“十六进制”编码?

在 Python >= 3.2 中将缓存存储到文件 functools.lru_cache