我已经盯着这个问题视而不见了.
我正在将XML封装的HTML数据融入Atlassian Confluence.对于-tags,我需要添加span-tag.但无论我如何尝试,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)
Run Code Online (Sandbox Code Playgroud)
对于此输入:
<tr>
<td>apa</td>
<td>1.2</td>
<td>
<a href="http://korv.com/apa.tar.gz">3.4</a>
</td>
<td>no</td>
</tr>
<tr>
<td>coreutils</td>
<td>6.12</td>
<td>
<a href="http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz">8.21</a>
</td>
<td>no</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
这是输出:
<td>no tags</td>None
<td><span>one tag</span></td>None
1.2
<td>no tags</td>None
<td><span>one tag</span></td>None
None
<td>no tags<a href="http://korv.com/apa.tar.gz">3.4</a></td>None
<td><span>one tag</span><a href="http://korv.com/apa.tar.gz">3.4</a></td>None
no
<td>no tags</td>None
<td><span>one tag</span></td>None
coreutils
<td>no tags</td>None
<td><span>one tag</span></td>None
6.12
<td>no tags</td>None
<td><span>one tag</span></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><span>one tag</span><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><span>one tag</span></td>None
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,-tag是不受影响的,而我的转换.我无法理解这个错误.
为什么我的文本转换完成后却不受现有的影响?
您正在将文本插入XML元素.文本始终将被转义为XML安全.
如果您想添加新标签,请创建一个新标签Element; 该ElementTree.SubElement()工厂是最简单的:
from lxml import etree
etree.SubElement(td, 'span').text = 'one tag'
Run Code Online (Sandbox Code Playgroud)
如果你想包装它的内容td,只需移动所有元素(加上.text属性:
def wrap(parent, tagname, **kw):
sub = etree.SubElement(parent, tagname, **kw)
parent.text, sub.text = None, parent.text
for index, child in enumerate(parent.iterchildren()):
if child is not sub:
sub.insert(index, child)
return parent
wrap(td, 'span')
Run Code Online (Sandbox Code Playgroud)
演示:
>>> 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 '
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |