HTML转ReportLab时嵌套列表项丢失问题求助
解决HTML转ReportLab PDF时嵌套列表父项丢失问题
核心问题定位
丢失父列表项(如Step2、Step4)的本质原因是:解析<li>元素时,代码只递归处理了内部的嵌套子列表,却跳过了当前<li>本身的文本内容。比如遇到<li>Step2<ul>...</ul></li>时,直接进入子<ul>的处理逻辑,完全没渲染“Step2”这段文本。针对性修复方案
调整列表项处理顺序
遍历<li>节点时,必须先输出当前项的文本,再递归处理子列表。示例代码:def process_list_item(li_node, story, indent_level): # 提取并添加当前列表项的文本 li_text = get_li_text(li_node) if li_text: list_style = get_custom_list_style(indent_level) story.append(Paragraph(li_text, list_style)) # 递归处理子列表 for child in li_node: if child.tag in ('ul', 'ol'): process_list(child, story, indent_level + 1)完整提取列表项文本
有些<li>的文本可能分散在子节点前后,要结合text和tail属性获取完整内容:def get_li_text(li_node): parts = [] # 提取节点本身的文本 if li_node.text: parts.append(li_node.text.strip()) # 提取非列表子节点的文本及后续文本 for child in li_node: if child.tag not in ('ul', 'ol'): if child.text: parts.append(child.text.strip()) if child.tail: parts.append(child.tail.strip()) return ' '.join(filter(None, parts))层级化列表样式
为不同层级的列表设置不同缩进,避免父项文本被子列表覆盖:from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet from reportlab.platypus import Paragraph def get_custom_list_style(level): base_style = getSampleStyleSheet()['BodyText'] return ParagraphStyle( f'ListLevel{level}', parent=base_style, leftIndent=25 * level, bulletIndent=10 * level )
验证示例
假设你的测试HTML为:- Step1
- Step2
- Substep2.1
- Substep2.2
- Step3
- Step4
- Substep4.1
修复后生成的PDF应完整显示Step1、Step2(含子项)、Step3、Step4(含子项),无父项丢失情况。
内容的提问来源于stack exchange,提问作者Cynate
相关产品推荐
相关产品推荐

