我有一个博客,我将博客帖子作为HTML字符串(基本上是html元素的文本)保存在数据库中。例如:我创建了一个博客帖子,结果是下面的字符串作为我的博客帖子内容。
<p>asdasd</p><p><em></em><div>another string</div>
当用户查看帖子时,我从DB检索上面的内容,并使用lxml etree对内容做一些处理(这与我的问题无关),并将内容返回给浏览器。
from lxml import etree as ET
obj = ET.parse(StringIO.StringIO(self.text), parser=ET.HTMLParser()) #self.text holds the html string of blog post
return ET.tostring(tree) # return the html string to browser
现在问题是发送到浏览器的内容,如下所示
<p>asdasd</p><p></em /><div>another string</div>
这会导致chrome浏览器出现各种问题,例如,在用户浏览器上,上面的html将显示如下(在chrome自动尝试修复它之后)
<p>asdasd</p><p></em><div>another string</div></em>
有没有办法防止lxml etree在解析时更改html内容?似乎etree对所有的空html元素都是这样做的。例如,如果我放入一个<div></div>
,那么它将被替换为<div />
发布于 2018-04-12 14:54:06
下面是您希望使用lxml在Python中尝试XML规范化(C14N)的内容:
从这个源https://www.w3.org/TR/xml-c14n/中,我们可以看到:
将
空元素转换为开始-结束标记对
示例代码:
from lxml import etree
xml = "<main><p>asdasd</p><p><em></em><div>another string</div></p></main>"
root_element = etree.XML(xml)
print(etree.tostring(root_element, method="c14n")))
输出
b'<main><p>asdasd</p><p><em></em><div>another string</div></p></main>'
https://stackoverflow.com/questions/39186304
复制相似问题