如何让lxml的tostring方法输出自闭合<br/>或成对闭合标签?
解决lxml html模块输出
<br>标签格式的问题 两种实现需求的方法
1. 输出自闭合的<br/>
lxml的html.tostring()默认按HTML规范输出,而HTML里<br>是无需闭合的空元素。要强制输出XML/XHTML风格的自闭合标签,只需给tostring()加上method='xml'参数:
from lxml import html root = html.fromstring('<br/>') result = html.tostring(root, method='xml') # 输出: b'<br/>',转字符串可加.decode()
2. 输出成对的<br></br>
如果想要得到类似<a></a>的成对标签格式,不要用html模块解析,改用lxml.etree(XML解析器),因为XML会把所有自闭合标签转换为成对形式:
from lxml import etree root = etree.fromstring('<br/>') result = etree.tostring(root) # 输出: b'<br></br>'
原因说明
lxml的html模块严格遵循HTML规范,其中<br>属于**空元素(void elements)**范畴,这类元素在HTML语法里不需要闭合标签,所以默认tostring()会输出<br>;而<a>是常规容器元素,即使输入是自闭合写法,也会被自动转换为成对标签。
源码相关位置
- 定义HTML空元素的集合在lxml的
html/defs.py文件中,变量名为void_elements,里面包含了br、img、input等所有HTML标准空元素。 - 在
tostring的处理逻辑中(对应html/Element.py或底层序列化代码),当指定method='html'时,会检查当前元素是否在void_elements中,若是则按单标签格式输出;切换为method='xml'时,会跳过这个检查,采用XML的序列化规则。
内容的提问来源于stack exchange,提问作者TheDuck
相关产品推荐
相关产品推荐

