昨天我安装了BeautifulSoup 4.0b,现在我想添加一个regex替换对,它将在预解析器阶段运行。在文档中,它说我可以简单地使用markupMassage参数来__init__分配给MARKUP_MASSAGE,但是似乎4.0b不再具有这些属性,尽管在自述文件中没有提到它(除非我错过了它?).
所以我的问题是,有没有办法从BeautifulSoup4.0b获得同样的功能

最佳答案

自述文件确实(在某种程度上)涵盖了这个问题,但必须通过阅读本节中的行来推断:
=关于靓汤4=
这是一个几乎完全重写,删除美丽汤的习惯
HTML解析器有利于让您编写一个小胶水的系统
编写代码并插入所需的任何HTML或XML解析器。
Beautiful Soup 4.0为四个解析器提供了胶水代码:
Python的标准HTMLParser
lxml的HTML和XML解析器
html5lib的HTML解析器
HTMLParser是默认的,但我建议您安装
其他解析器,否则在处理实际标记时会遇到问题。
旧的自定义解析器基于已弃用的sgmllib模块(在Python 3中删除)中的SGMLParser,而markupMassage功能主要用于修复SGMLParser无法处理的无效标记。所以当旧的自定义解析器运行时,markupMassage功能也随之运行。
可能,任何在默认情况下不再提供的功能现在都必须通过子类化一个新的解析器来添加。
因此,如果安装了lxml,则需要执行以下操作:

from bs4.builder import LXMLTreeBuilder

class Builder(LXMLTreeBuilder):
    def __init__(self, *args, **kwargs):
        super(Builder, self).__init__(*args, **kwargs)

    def prepare_markup(self, *args, **kwargs):

        markup, user_enc, doc_enc = super(Builder, self).prepare_markup(*args, **kwargs)

        # do markup massaging ...

        return markup, user_enc, doc_enc

soup = BeautifulSoup(html, builder=Builder())

10-08 13:13