lxml:强制将换行符转换为实体

时间:2018-03-31 19:51:23

标签: python xml lxml

有没有办法在文本元素中输出新行作为
个实体? 目前,新行按原样插入到输出中:

from lxml import etree
from lxml.builder import E
etree.tostring(E.a('one\ntwo'), pretty_print=True)
b'<a>one\ntwo</a>\n'

期望的输出:

b'<a>one&#13;two</a>\n'

1 个答案:

答案 0 :(得分:2)

查看lxml docs后,看起来无法强制将某些字符打印为转义实体。它看起来像转义的字符列表因输出编码而异。

所有这些都说明了,我会在lxml之上使用BeautifulSoup's prettify()来完成工作:

from bs4 import BeautifulSoup as Soup
from xml.sax.saxutils import escape

def extra_entities(s):
    return escape(s).replace('\n', '&#13;')

soup = Soup("<a>one\ntwo</a>", 'lxml-xml')
print(soup.prettify(formatter=extra_entities))

输出:

<?xml version="1.0" encoding="utf-8"?>
<a>
 one&#10;two
</a>

请注意,新行应该实际映射到&#10;&#13;用于回车或\r)但我不会争辩,因为我无法在本地测试FCPXML格式。