首页 > 解决方案 > 如何使用美丽的汤4渲染内联元素

问题描述

我正在使用 bs4 将标签转换为汇合宏

输入:

<p>
<img src="path/to/file.jpg" />
</p>

预期输出:

<p>
    <ac:image ac:align="center" ac:layout="center">
        <ri:attachment ri:filename="file.jpg" ri:version-at-save="1" />
    </ac:image>
</p>

这是用于实现它的功能

def transform_img_to_confluence(soup):
    def get_image_tag(image_name):
        return BeautifulSoup(textwrap.dedent('''
            <ac:image ac:align="center" ac:layout="center">
                <ri:attachment ri:filename="{}" ri:version-at-save="1" />
            </ac:image>
        ''').format(image_name), "html.parser")
        


    for img in soup.find_all('img'):
        path = img['src']
        image_name = os.path.basename(path)

        image_tag = get_image_tag(image_name)
        img.replace_with(image_tag)
soup = BeautifulSoup(html_string, "html.parser")
transform_img_to_confluence(soup)

print(soup.prettify())

当我在调用此函数后检查汤时,我希望将标签替换为以下内容(ri:attachment元素为内联)

<ac:image ac:align="center" ac:layout="center">
    <ri:attachment ri:filename="file.jpg" ri:version-at-save="1" />
</ac:image>

但不幸的是,我得到了这个。(ri:attachment带有打开和关闭标签)

<ac:image ac:align="center" ac:layout="center">
    <ri:attachment ri:filename="file.jpg" ri:version-at-save="1">
    </ri:attachment>
</ac:image>

如何确保获得所需的内联元素?

标签: pythonbeautifulsoup

解决方案


问题来自解析器。在你的情况下lxml-xml应该这样做。以下是可用解析器的一些示例输出

from bs4 import BeautifulSoup
a="""<a><b /></a>"""
print(BeautifulSoup(a, 'lxml'))
>>> <html><body><a><b></b></a></body></html>

print(BeautifulSoup(a, 'lxml-xml'))
>>> <?xml version="1.0" encoding="utf-8"?>
>>> <a><b/></a>

print(BeautifulSoup(a, 'html.parser'))
>>> <a><b></b></a>

print(BeautifulSoup(a, 'html5lib'))
>>> <html><head></head><body><a><b></b></a></body></html>

推荐阅读