python beautifulsoup new_tag:将类作为属性分配

16 投票
3 回答
9769 浏览
提问于 2025-04-18 02:34

我刚接触Python和BeautifulSoup,所以可能有简单的答案我找不到。

当我调用 .new_tag('name') 时,我也可以像这样设置属性:.new_tag('a', href='#', id='link1')

但是我不能用这种方式设置类,因为“class”是一个保留字。同时,我也不能用这种方式添加名称,因为它被用作标签名称的关键字。我知道我可以在之后再添加,比如用 tag['class'],但我想知道,添加类到新标签是否只有这种方法?或者有没有办法一步到位地做到这一点?

3 个回答

0

这个简单的函数可以让你绕过一些限制,通过使用 klass 这个参数:

from bs4 import BeautifulSoup

def create_tag(name, namespace=None, nsprefix=None, attrs={},
               sourceline=None, sourcepos=None, **kwattrs):
    """It does the same as soup.new_tag(),
    but turns 'klass' attribute into 'class'"""
    newkwattrs = {}
    for key, value in kwattrs.items():
        if key == 'klass':
            key = 'class'
        newkwattrs[key] = value
    soup = BeautifulSoup('', 'html.parser')
    tag = soup.new_tag(name, namespace, nsprefix, attrs, sourceline,
                       sourcepos, **newkwattrs)
    return tag.extract()

现在你可以像这样编写代码,例如:

p_tag = create_tag('p', klass='foo')

结果将会是:

<p class="foo"></p>
8

你可以使用 attrs 字典:

soup.new_tag("a",attrs={"class": "classname", "href" : "#", "id" : "link1"})

结果将会是:

<a class="classname" href="#" id="link1"></a>    
32

你说得对,"class"是Python的一个保留字,不能用作关键字参数,因为这样会让语言解析器报错。

不过,有个解决办法——你可以通过一个字典来传递关键字参数,前面加上**。这样一来,“class”就变成了一个普通的字符串,不会和保留字冲突,而在运行时,关键字参数可以正常传递。

在你的情况下,解决办法应该是这样的 -

soup.new_tag('a', href='#', id='link1', **{'class':'classname'})

我知道这样有点丑,但确实有效.. ;)

撰写回答