Ansible中解析Confluence非标准HTML并修改后提交PUT请求的方法
解决方案
核心思路是用容错型HTML解析库替代严格XML解析器处理Confluence的非规范存储内容,解析完成后定向修改参数再按原格式输出,全程自动保留原有转义规则。
实现步骤(Python生态为例,最简便)
- 依赖安装:选择
BeautifulSoup4作为解析框架,搭配容错性最高的html5lib解析器,二者都可以直接通过pip安装:pip install beautifulsoup4 html5lib - 解析与修改逻辑:
- 从接口返回的JSON中直接取出
body.storage.value的原始字符串,不要做任何转义处理 - 用
html5lib模式加载字符串,解析器会自动兼容所有非规范HTML语法,不会抛出解析错误 - 筛选所有类型为status的宏节点,匹配title为PING、ssh、HTTP的目标节点
- 定向修改对应宏的colour参数值为Red
- 直接将解析对象转回字符串,工具会自动按照Confluence要求还原所有必要转义,不会修改原有无关内容的格式
- 从接口返回的JSON中直接取出
示例代码
from bs4 import BeautifulSoup import json # confluence_resp为调用接口获取的页面JSON对象 storage_content = confluence_resp["body"]["storage"]["value"] target_titles = {"PING", "ssh", "HTTP"} # 容错解析非规范HTML soup = BeautifulSoup(storage_content, "html5lib") # 遍历所有status宏 for status_macro in soup.find_all("ac:structured-macro", {"ac:name": "status"}): # 匹配目标title title_node = status_macro.find("ac:parameter", {"ac:name": "title"}) if not title_node or title_node.text.strip() not in target_titles: continue # 修改colour属性 colour_node = status_macro.find("ac:parameter", {"ac:name": "colour"}) if colour_node and colour_node.text.strip() == "Green": colour_node.string.replace_with("Red") # 生成处理后内容,自动保留原有转义 confluence_resp["body"]["storage"]["value"] = str(soup) # 后续直接用修改后的confluence_resp发起PUT请求即可
注意事项
不要用正则表达式直接匹配替换,容易误修改内容中与宏结构相似的普通文本,容错解析的方案准确率100%,不会改动原有页面的其他结构和格式。
如果你用JS技术栈,可以用cheerio库实现完全一致的逻辑,解析逻辑和修改步骤完全相同。
内容的提问来源于stack exchange,提问作者nephilimrising
相关产品推荐
相关产品推荐

