lxml在XML中添加了URL编码吗?

2 投票
1 回答
542 浏览
提问于 2025-04-17 19:53

我先说明一下,我在Windows 7上使用的是Python 2.7.3(x64),并且使用的是lxml 2.3.6。

我遇到了一个小问题,希望有人能帮我解决。我在网上找不到解决办法,可能是我没有找到正确的关键词。

总之,我的问题是,我正在用lxml程序化地生成一些XML,然后把这些内容输出到一个文本文件中,但lxml把换行符转换成了文本
,这有点像网址编码,但我用的是XML而不是HTML。

举个例子,我在记事本中创建了一个简单的文本文件,内容如下:

This
is
my
text

然后我构建了一些XML,并把这个文本添加到XML中:

from lxml import etree

textstr = ""
fh = open("mytext.txt", "rb")
for line in fh:
    textstr += line

root = etree.Element("root")
a = etree.SubElement(root, "some_element")
a.text = textstr

print etree.tostring(root)

这里的问题是打印出来的结果看起来是这样的:

<root><some_element>This&#13;
is&#13;
my&#13;
text</some_element></root>

对我来说,换行是可以接受的,但&#13;这个元素就不行。

我发现这个问题是因为我以二进制模式"rb"打开文本文件(我确实需要这样做,因为我的应用程序正在索引一个大文本文件)。如果我不以二进制模式"r"打开文件,那么输出就不会包含&#13;(但当然,这样我的索引功能就无法使用了)。

我还尝试把etree.tostring改成:

print etree.tostring(root, method="xml")

但是输出没有任何变化。

现在,我可以把XML文本转成字符串,然后替换掉&#13;的部分,但我希望能有一个更优雅的解决办法,因为我解析的文本文件并不在我的控制之下,我担心文本文件中的其他元素可能会在我不知情的情况下被转换成网址风格的编码。

有没有人知道怎么防止这种编码发生呢?

1 个回答

0

在Windows系统中,换行符用的是\r\n,而在Unix系统中,换行符只用\n。这段代码会把行末的\r去掉,如果行末有的话(这样代码也能适用于Unix格式的文本文件)。它最多只会去掉一个\r,所以如果行中间还有其他的\r,它们会被保留下来。

import re
textstr = ""
with open("mytext.txt", "rb") as fh:
    for line in fh:
        textstr += re.sub(r'\r$', '', line)
print(repr(textstr))

撰写回答