如何在编写utf8文档时阻止lxml生成html实体

2024-09-28 22:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要处理包含罗马尼亚字符文本的XML文件(文本类似于“licenţeşI mărci”)。在

在处理完这些文本后,文本将以html文档的形式结束。 如果在最后一步,我使用类似于以下内容的方式输出内容:

doc.write(path, encoding='utf-8', method='xml' )

注意:上面的doclxml.etree.ElementTree的一个实例

我得到的东西是:

^{pr2}$

一切看起来都很好(即罗马尼亚字符不会转换成html实体)。在

如果我真的使用html编码方法

^{3}$

我得到的东西是:

<span id="128927">licen&#355;e &#351;i m&#259;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&#x163;e &#x15F;i m&#x103;rci</span>

Tags: path文档文本实体dochtmltransformxml