使用BeautifulSoup上传HTML到Confluence报JSON序列化错误如何解决
问题原因
你调用confluence.create_page时传入的body参数是BeautifulSoup类的实例对象,而Confluence的Python SDK要求body参数为可序列化的字符串类型,SDK底层会把请求参数转成JSON发送,BeautifulSoup对象没有默认的JSON序列化规则,所以触发了该报错。
同时你的现有代码还有两处语法问题:
with open("sample.html", 'r')as f末尾缺少半角冒号- 缺少
BeautifulSoup的导入语句
修复方案
方案1:无需处理HTML时直接传入原始HTML文本
如果你不需要对读取的HTML做额外的节点修改、过滤操作,完全不需要调用BeautifulSoup解析,直接把读取到的文件内容传给body参数即可:
import yaml from atlassian import Confluence import urllib, mimetypes import requests import codecs,json from bs4 import BeautifulSoup confluence = Confluence( url='https://confluence.com', username='12344', password='abcd') ####读取HTML文件,补全冒号 with open("sample.html", 'r') as f: content = f.read() # 直接传原始HTML字符串即可 status = confluence.create_page( 'ABCD', #空间标识 'Report', #页面标题 content, #页面内容 parent_id=123456, #父页面ID type='page', representation='storage', editor='v2' ) print(status)
方案2:需要用BeautifulSoup处理HTML时,转成字符串再传入
如果你需要用BeautifulSoup修改、过滤HTML节点,处理完成后调用str(soup)或者soup.prettify()转成字符串再传给body参数:
# 前面的初始化、读取文件代码保持不变 soup = BeautifulSoup(content, 'html.parser') # 此处可添加你的HTML处理逻辑,比如删除无效标签、修改节点内容等 # 示例:删除所有script标签 # for tag in soup.find_all("script"): # tag.decompose() # 转成字符串后传入 status = confluence.create_page( 'ABCD', 'Report', str(soup), # 也可以用soup.prettify()输出格式化后的HTML parent_id=123456, type='page', representation='storage', editor='v2' )
补充注意事项
Confluence的存储格式支持大部分标准HTML标签,但部分特殊标签、自定义标签可能会被自动过滤,如果上传后发现部分内容丢失,可以先将HTML转成Confluence标准的XHTML存储格式再上传。
内容的提问来源于stack exchange,提问作者Y2Jepic
相关产品推荐
相关产品推荐

