我需要处理包含罗马尼亚字符文本的XML文件(文本类似于“licenţeşI mărci”)。在
在处理完这些文本后,文本将以html文档的形式结束。 如果在最后一步,我使用类似于以下内容的方式输出内容:
doc.write(path, encoding='utf-8', method='xml' )
注意:上面的doc
是lxml.etree.ElementTree
的一个实例
我得到的东西是:
^{pr2}$一切看起来都很好(即罗马尼亚字符不会转换成html实体)。在
如果我真的使用html编码方法
^{3}$我得到的东西是:
<span id="128927">licenţe şi mărci</span>
虽然在另一个文档中使用的是文本,但在另一个文档中使用的文本也完全被文档中的文本所混淆。在
虽然使用xml
作为etree.ElementTree.write
的方法参数似乎解决了我当前的问题,但感觉不对,因为我确实想生成html
文件,而且在其他上下文中可能会表现得很糟糕。在
有没有一种方法可以将文档写成html(使用method='html'
),而不用lxml用html实体替换非ascii字符?在
在@mzjn的问题之后,事实证明这个故事有点复杂。在
以下是重现问题的最小代码:
from lxml import etree
from os import path
def process( method, out_name ):
# the doc
x = etree.XML('<span id="123">licenţe şi mărci</span>')
tree = etree.ElementTree(x)
#do some processing
modifiedTree = modifyDoc(tree)
# write the result
modifiedTree.write(out_name, encoding='utf-8', method=method)
def modifyDoc(tree):
root = tree.getroot()
doNothingTransformPath = _absolutePath('transform.xslt')
transform_doc = etree.parse(doNothingTransformPath)
transform = etree.XSLT(transform_doc)
return transform(root)
def _absolutePath(relative):
return path.abspath(path.join( __file__ , '..', relative))
if __name__ == '__main__':
process( 'xml', 'out1.xml')
process( 'html', 'out2.html')
其中(在本例中)XSLT转换(什么都不做)是:
—转换.xslt--在
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
<xsl:copy-of select="/"/>
</xsl:template>
</xsl:stylesheet>
如果不通过XSLT转换传递文档,则输出不包含HTML实体,当通过modifyDoc函数传递(即应用XSLT转换)时,输出将如上所述进行更改(例如,当使用method='html'
时,输出包含HTML实体)。在
所以运行上面的程序会输出两个文件:
--out1.xml--
^{pr2}$以及 --out2.html--
<span id="123">licenţe şi mărci</span>
目前没有回答
相关问题 更多 >
编程相关推荐