我有一个博客,我将博客文章保存为数据库中的HTML字符串(基本上是html元素的文本)。例如:我创建了一篇博客文章,结果将以下字符串作为我的博客文章内容。
<p>asdasd</p><p><em></em><div>another string</div>
当用户来查看帖子时,我从数据库中检索上述内容并使用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 />
答案 0 :(得分:0)
您希望使用lxml在Python中尝试使用XML Canonicalization(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>'