首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >lxml etree将<em></em>替换为<em/>

lxml etree将<em></em>替换为<em/>
EN

Stack Overflow用户
提问于 2016-08-28 06:21:36
回答 1查看 107关注 0票数 0

我有一个博客,我将博客帖子作为HTML字符串(基本上是html元素的文本)保存在数据库中。例如:我创建了一个博客帖子,结果是下面的字符串作为我的博客帖子内容。

代码语言:javascript
运行
复制
<p>asdasd</p><p><em></em><div>another string</div>

当用户查看帖子时,我从DB检索上面的内容,并使用lxml etree对内容做一些处理(这与我的问题无关),并将内容返回给浏览器。

代码语言:javascript
运行
复制
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

现在问题是发送到浏览器的内容,如下所示

代码语言:javascript
运行
复制
<p>asdasd</p><p></em /><div>another string</div>

这会导致chrome浏览器出现各种问题,例如,在用户浏览器上,上面的html将显示如下(在chrome自动尝试修复它之后)

代码语言:javascript
运行
复制
<p>asdasd</p><p></em><div>another string</div></em>

有没有办法防止lxml etree在解析时更改html内容?似乎etree对所有的空html元素都是这样做的。例如,如果我放入一个<div></div>,那么它将被替换为<div />

EN

回答 1

Stack Overflow用户

发布于 2018-04-12 14:54:06

下面是您希望使用lxml在Python中尝试XML规范化(C14N)的内容:

从这个源https://www.w3.org/TR/xml-c14n/中,我们可以看到:

空元素转换为开始-结束标记对

示例代码:

代码语言:javascript
运行
复制
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")))

输出

代码语言:javascript
运行
复制
b'<main><p>asdasd</p><p><em></em><div>another string</div></p></main>'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39186304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档