使用 Beautiful Soup 创建名为“name”的属性的 new_tag

szu*_*ins 3 python beautifulsoup

我有一个 XML 块,我需要在其中插入一些元素

<importer in="!SRCFILE!" media="movie">
<video-out id="video_2_importer"></video-out>
<audio-out id="audio_2_importer"></audio-out>
</importer>
Run Code Online (Sandbox Code Playgroud)

我需要做的是在这个块中插入一些选项,所以我的输出看起来像这样:

<importer media="movie" in="!SRCFILE!">
    <video-out id="video_2_importer"></video-out>
    <audio-out id="audio_2_importer"></audio-out>
    <option name="start-time" value="60"></option>
    <option name="end-time" value="120"></option>
</importer>
Run Code Online (Sandbox Code Playgroud)

我已经成功地使用 bs4 来查找元素并创建新标签,但似乎参数 'name' 是 bs4 中的保留字。我尝试了以下方法:

in_point = soup.new_tag('option', **{'value':'60','name':'start-time'})
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误

TypeError: new_tag() got multiple values for keyword argument 'name'
Run Code Online (Sandbox Code Playgroud)

如果我从我的字典中删除 'name':'start-time',它会正确插入。如果我将“名称”更改为任何其他文本,它就会起作用。因此,执行以下操作会导致正确的标记创建。

in_point = soup.new_tag('option', **{'value':'60','stuff':'start-time'})
Run Code Online (Sandbox Code Playgroud)

我知道我可能在语法上做错了一些事情来绕过允许我使用属性“名称”,我只是不知道是什么。

ale*_*cxe 6

在这种情况下,您可以通过Tag以下方式创建实例:

from bs4 import BeautifulSoup, Tag

in_point = Tag(builder=soup.builder, 
               name='option', 
               attrs={'value':'60','name':'start-time'})
Run Code Online (Sandbox Code Playgroud)

这本质上new_tag()是在幕后做的事情:

def new_tag(self, name, namespace=None, nsprefix=None, **attrs):
    """Create a new tag associated with this soup."""
    return Tag(None, self.builder, name, namespace, nsprefix, attrs)
Run Code Online (Sandbox Code Playgroud)