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)
我知道我可能在语法上做错了一些事情来绕过允许我使用属性“名称”,我只是不知道是什么。
在这种情况下,您可以通过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)