You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中BeautifulSoup转义问题:Confluence表格更新失败求助

解决BeautifulSoup4更新Confluence表格时的标签二次转义问题

首先咱们得搞清楚问题根源:当你调用soup.append(str)时,BeautifulSoup会把传入的字符串当成纯文本内容处理,自动转义所有HTML特殊字符(比如<变成&lt;)。如果你的字符串本身已经是转义过的(比如从Confluence获取的内容里已经有&lt;tr&gt;),这时候再append就会触发二次转义,把&lt;变成&amp;lt;,最终就出现了你看到的&amp;lt;tr&amp;gt;"string"&amp;lt;/tr&amp;gt;这种情况。

直接解决转义问题的方法

不要直接append字符串,而是把字符串转换成BeautifulSoup能识别的Tag对象,这样它就会把内容当成HTML标签处理,而不是纯文本。这里有两种常用的实现方式:

方式1:用BeautifulSoup解析字符串生成Tag对象

如果已经有了完整的HTML行字符串,直接用BeautifulSoup解析它,再添加到表格里:

from bs4 import BeautifulSoup

# 假设这是从Confluence获取的页面内容
confluence_content = "<table><tr><td>旧内容</td></tr></table>"
soup = BeautifulSoup(confluence_content, 'html.parser')
table = soup.find('table')

# 你要添加的新行HTML
new_row_html = '<tr><td>"string"</td></tr>'
# 把字符串解析成BS的Tag对象
new_row_tag = BeautifulSoup(new_row_html, 'html.parser')
# 添加到表格中
table.append(new_row_tag)

# 此时输出的内容就是正确的HTML,不会二次转义
print(str(soup))

方式2:手动创建标签(更可控)

如果需要更精细地控制每个标签的属性或内容,可以手动创建Tag对象:

from bs4 import BeautifulSoup

soup = BeautifulSoup(confluence_content, 'html.parser')
table = soup.find('table')

# 创建<tr>标签
new_tr = soup.new_tag('tr')
# 创建<td>标签并设置内容
new_td = soup.new_tag('td')
new_td.string = '"string"'
# 把<td>加到<tr>里,再把<tr>加到表格里
new_tr.append(new_td)
table.append(new_tr)

额外处理:如果已有转义后的字符串

如果你的字符串已经是转义后的格式(比如&lt;tr&gt;"string"&lt;/tr&gt;),可以先用html.unescape()解码成原始HTML,再交给BS处理:

import html
from bs4 import BeautifulSoup

escaped_row_str = '&lt;tr&gt;"string"&lt;/tr&gt;'
# 先解码成原始HTML
original_html = html.unescape(escaped_row_str)
new_row_tag = BeautifulSoup(original_html, 'html.parser')
table.append(new_row_tag)

更优的Confluence表格更新方案

直接解析HTML修改后再更新,有时候会遇到Confluence的特殊格式兼容问题(比如Confluence页面的storage格式有自己的专属标签或属性)。更稳妥的方式是结合Confluence REST API来操作:

  1. 调用API获取页面的storage内容:Confluence的页面内容以storage格式存储(本质是符合Confluence规范的HTML),通过GET /rest/api/content/{pageId}?expand=body.storage接口获取。
  2. 正确修改storage内容:用上面的BS方法修改解析后的storage HTML,避免转义问题。
  3. 调用API更新页面:把修改后的HTML作为新的storage内容,通过PUT /rest/api/content/{pageId}接口提交更新。

这种方式能最大程度保证和Confluence的格式兼容,减少因为HTML解析导致的异常。

内容的提问来源于stack exchange,提问作者chon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:32:42