lxml etree用<em>替换<em> </em>

时间:2016-08-27 22:21:36

标签: python django html-parsing lxml

我有一个博客,我将博客文章保存为数据库中的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 />

1 个答案:

答案 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>'