当前位置: 首页 > 面试题库 >

禁用特殊的“类”属性处理

江鹏飞
2023-03-14
问题内容

故事:

当您使用解析HTML时BeautifulSoupclassattribute被视为多值属性,并以特殊方式处理:

请记住,单个标签的“ class”属性可以有多个值。当您搜索与某个CSS类匹配的标签时,您将与其任何CSS类进行匹配。

另外,内建的引号HTMLTreeBuilder用作BeautifulSoup其他树构建器类的基础,例如HTMLParserTreeBuilder

# The HTML standard defines these attributes as containing a
# space-separated list of values, not a single value. That is,
# class="foo bar" means that the 'class' attribute has two values,
# 'foo' and 'bar', not the single value 'foo bar'.  When we
# encounter one of these attributes, we will parse its value into
# a list of values if possible. Upon output, the list will be
# converted back into a string.

问题:

如何配置BeautifulSoupclass作为通常的单值属性处理?换句话说,我不希望它class专门处理并将其视为常规属性。

我尝试过的

实际上,我通过创建 自定义树构建器类class从特殊处理的属性列表中删除来使其工作:

from bs4.builder._htmlparser import HTMLParserTreeBuilder

class MyBuilder(HTMLParserTreeBuilder):
    def __init__(self):
        super(MyBuilder, self).__init__()

        # BeautifulSoup, please don't treat "class" specially
        self.cdata_list_attributes["*"].remove("class")


soup = BeautifulSoup(data, "html.parser", builder=MyBuilder())

我不喜欢这种方法,因为它非常“不自然”且“神奇”,涉及导入“私有”内部_htmlparser。我希望有一个更简单的方法

注意:我想保存所有其他与HTML解析相关的功能,这意味着我不想HTML使用仅“ xml”功能进行解析(这可能是另一个解决方法)。


问题答案:

我不喜欢这种方法,因为它非常“不自然”且“神奇”,涉及导入“私有”内部_htmlparser。我希望有一个更简单的方法。

是的,您可以bs4.builder改为从导入:

from bs4 import BeautifulSoup
from bs4.builder import HTMLParserTreeBuilder

class MyBuilder(HTMLParserTreeBuilder):
    def __init__(self):
        super(MyBuilder, self).__init__()
        # BeautifulSoup, please don't treat "class" as a list
        self.cdata_list_attributes["*"].remove("class")


soup = BeautifulSoup(data, "html.parser", builder=MyBuilder())

如果您不想重复自己的话就足够重要了,可以将构建器放在其自己的模块中,然后向其注册,register_treebuilders_from()以便优先使用。



 类似资料:
  • 问题内容: 该类的Javadoc 在下有以下注释。 注意:除非如此定义,否则名称为“ ID”或“ id”的属性不是ID类型的 因此,我将XHTML文档读入DOM(使用Xerces 2.9.1)。 该文档中有一个普通的旧文档。 我叫,它返回null。 我使用XPath来获取“ // * [id =’fribble’]”,一切都很好。 因此,问题是,是什么导致实际将ID属性标记为“如此定义”? 问题答

  • 当序列化特殊字符(如TAB、换行和回车)作为属性值时,我遇到了一个问题。 据此,http://www.w3.org/TR/1999/WD-xml-c14n-19991109.html#charescaping,这些应编码为

  • 在Solidity的类型系统里面有一些类型有一些在其它语言中没有的语法。其中之一就是函数类型。但依然,使用var时,可以把函数类型作为本地变量。 contract FunctionSelector { function select(bool useB, uint x) returns (uint z) { var f = a; if (useB) f = b; ret

  • 问题内容: 如果我的对象包含以%符号开头的属性,那么如何获取其值。 如果我用 我得到一个错误 我知道我不应该在变量名中使用%,但这不是我的工作,我坚持使用它。 问题答案:

  • 我有一个集合的联系人结构如下: 因为“susan@xpto.com”上的点 如何逃脱这点? 我尝试了和但没有成功。

  • 本文向大家介绍CSS content属性特殊字符有哪些?相关面试题,主要包含被问及CSS content属性特殊字符有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考文章 来自CSDN