Python解析lxml.etree转Markdown时如何保留粗体格式
itertext()会直接提取所有文本节点、忽略标签语义,所以无法保留格式,你可以通过递归遍历节点、对指定标签的内容手动加Markdown加粗标记实现需求。
实现逻辑
- 遍历目标元素下的所有节点,区分普通文本节点和元素节点
- 普通文本节点直接保留内容
- 识别为粗体的元素(示例中为
nobr,可按需添加b、strong等其他标签),返回内容时前后包裹* - 其他元素递归处理内部节点即可
代码示例
from lxml import etree def parse_to_md(element, bold_tags=("nobr", "strong", "b")): content_parts = [] # 遍历当前节点下所有子节点(含文本节点、元素节点) for node in element.xpath("node()"): if isinstance(node, str): # 普通文本直接追加,示例中自带多余双引号可按需做strip处理 content_parts.append(node.strip('"')) elif isinstance(node, etree._Element): inner = parse_to_md(node, bold_tags) # 粗体标签内容加*包裹 if node.tag.lower() in bold_tags: content_parts.append(f"*{inner}*") else: content_parts.append(inner) return "".join(content_parts) # 测试你的示例场景 test_html = '''<li id="id1"> "Normal text " <nobr>bold</nobr> . </li>''' element = etree.fromstring(test_html) print(parse_to_md(element))
运行后输出结果为:Normal text *bold*.,符合保留粗体格式的要求。
你可以根据实际页面的标签规则调整bold_tags的取值,适配更多粗体对应的HTML标签。
内容的提问来源于stack exchange,提问作者Hamperfait
相关产品推荐
相关产品推荐

