python - 如何使用美丽的汤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>
如何确保获得所需的内联元素?
解决方案
问题来自解析器。在你的情况下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>
推荐阅读
- matlab - 使用 parfeval() 时的 Matlab-GUI 警告:“无法保存 App Designer 应用程序对象。”
- spacy - 是否可以获得 IOB 格式的预测?- NER
- c++ - 带有范围滑块的 OpenCV HSV 过滤器不起作用
- laravel - [Vue 警告]:挂载钩子错误:“ReferenceError: google 未定义
- java - 使用 java 8 流 api 做数组列表的深拷贝,但得到构建时间错误
- flask - Flask 模板中的表单状态丢失
- excel - Excel,从一组重复记录中查找最新修改行的公式
- java - 为什么我的代码无休止地测试(n 皇后问题 / java / blue)
- javascript - 带有 javascript 的 Laravel sanctum SPA 应用程序
- algolia - 当用户停止输入时向 algolia 服务器发送请求