python beautifulsoup new_tag:将类作为属性分配
我刚接触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'})
我知道这样有点丑,但确实有效.. ;)