如何将带制表符缩进的Python字符串转为层级化HTML列表并替换项目符号?
我来帮你解决这个问题!我们可以用Python内置库实现一个可靠的转换方案,通过跟踪缩进层级来构建嵌套HTML列表,同时处理项目符号的层级替换,完美解决你之前遇到的缩进错误和符号替换问题。
解决方案代码
def convert_to_nested_html(text): # 定义层级循环使用的项目符号 BULLETS = ['-', '*', 'o'] # 复用的样式字符串,减少冗余 LIST_STYLE = 'display:block; list-style-type:none; line-height: 17px; font: 13px "Times New Roman";' SPAN_STYLE = 'display:block; font: 13px "Times New Roman"' # 分割文本为行,过滤空行并去除换行符残留 lines = [line.rstrip('\r') for line in text.split('\n') if line.strip()] result = [f'<span style="{SPAN_STYLE}">'] # 栈结构:(当前层级, 是否已打开li标签),初始为最外层层级 stack = [(0, False)] for line in lines: # 计算当前行的缩进层级:开头制表符的数量 current_level = len(line) - len(line.lstrip('\t')) content = line.lstrip('\t') # 替换项目符号:如果行首是'- ',按层级替换为对应符号 if content.startswith('- '): bullet = BULLETS[current_level % len(BULLETS)] content = f'{bullet} {content[2:]}' # 调整嵌套层级:关闭多余的上层列表和li while stack[-1][0] > current_level: result.append('</li>') result.append('</ul>') stack.pop() # 同级行:关闭上一个li(如果已打开) if stack[-1][0] == current_level and stack[-1][1]: result.append('</li>') # 子层级:打开新的ul列表 if stack[-1][0] < current_level: result.append(f'<ul style="{LIST_STYLE}">') stack.append((current_level, False)) # 添加当前行的li标签 result.append(f'<li>{content}</li>') stack[-1] = (current_level, True) # 关闭所有未闭合的li和ul标签 while len(stack) > 1: result.append('</li>') result.append('</ul>') stack.pop() # 闭合最外层span result.append('</span>') # 拼接并返回格式化后的HTML return '\n'.join(result) # 测试你的示例输入 a = 'The Distribution as follows:\n\t\t- 71% as follows:\n\t\t\tfirst, to A;\n\t\t\tsecond, to B;\n\t\t\tthird, to C, D, and E as follows:\n\t\t\t\t- 15% to C\n\t\t\t\t- 85% to D and E.\n\t\t- 29% to F.' print(convert_to_nested_html(a))
代码逻辑说明
- 层级与符号管理:通过统计每行开头的制表符数量确定嵌套层级,循环使用预设的项目符号列表实现层级符号替换。
- 栈结构控制嵌套:用栈跟踪当前的嵌套层级和标签状态,动态处理
<ul>和<li>的开闭,彻底解决之前的缩进错误问题。 - 样式复用:把重复的CSS样式抽离成变量,让代码更简洁易维护。
- 边界处理:自动过滤空行,遍历结束后自动闭合所有未关闭的标签,保证HTML结构的完整性。
内容的提问来源于stack exchange,提问作者user2524282
相关产品推荐
相关产品推荐

