lxml转换“<”为&lt;。为什么?

2024-06-16 09:07:23 发布

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

我对这个问题视而不见。在

我正在将XML封装的HTML数据添加到Atlassian Confluence中。对于-tags,我需要添加一个span标记。但无论我如何尝试,lxml lib都会将我的<;和>;分别转换为<;和>。但是,转换只针对我的新标记,中的任何现有标记都不会改变其特征!在

看看下面的Python代码:

for x in doc.iter():
    if x.tag == "td":
        print x.text
        x.text = "no tags"
        print etree.dump(x)
        x.text = "<span>one tag</span>"
        print etree.dump(x)

对于此输入:

^{pr2}$

这是输出:

<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
1.2
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
None
<td>no tags<a href="http://korv.com/apa.tar.gz">3.4</a></td>None
<td>&lt;span&gt;one tag&lt;/span&gt;<a href="http://korv.com/apa.tar.gz">3.4</a></td>None
no
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
coreutils
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
6.12
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
None
<td>no tags<a href="http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz">8.21</a></td>None
<td>&lt;span&gt;one tag&lt;/span&gt;<a href="http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz">8.21</a></td>None
no
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None

如您所见,其中的-标记未被更改,而my则被转换。我不能理解这个错误。在

为什么对我的文本进行转换,而对现有的文本却未进行任何处理?在


Tags: no标记gnultgtnonehttptag
2条回答

当你写作的时候

x.text = "<span>one tag</span>"

你是说节点的内容就是文本。由于<和{}是XML中的保留字符,因此需要对它们进行转义。在

看起来您正在尝试创建新的<span>节点,要做到这一点,您必须创建这些节点。在

您正在将文本插入到XML元素中。文本总是被转义以保证XML安全。在

如果要添加新标记,请创建一个新的Element^{} factory最简单:

from lxml import etree

etree.SubElement(td, 'span').text = 'one tag'

如果您想包装td的内容,只需移动所有元素(加上.text属性:

^{pr2}$

演示:

>>> etree.tostring(doc.findall('.//td')[2])
'<td>\n    <a href="http://korv.com/apa.tar.gz">3.4</a>\n  </td>\n  '
>>> etree.tostring(wrap(tree.findall('.//td')[2], 'span'))
'<td><span>\n    <a href="http://korv.com/apa.tar.gz">3.4</a>\n  </span></td>\n  '

相关问题 更多 >