lxml在xml中添加url编码?

时间:2013-03-21 14:06:44

标签: python lxml

我将在前面指出我在Windows 7上使用Python 2.7.3(x64),使用lxml 2.3.6。

我有一点奇怪的问题,我希望有人可以提供帮助。我没有在网上找到解决方案,也许我不是在寻找合适的东西。

无论如何,我有一个问题,我用编程方式用lxml构建一些XML,然后将其输出到文本文件,问题是lxml将回车符转换为文本
,几乎就像urlencoding - 但是我没有使用HTML我正在使用XML。

例如,我在记事本中创建了一个简单的文本文件,如下所示:

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;工件,但是,我希望有一个更优雅的解决方案 - 因为我解析的文本文件不在我的控制之下我担心在我不知情的情况下,文本文件的其他元素可能会转换为url样式编码。

有没有人知道防止这种编码发生的方法?

1 个答案:

答案 0 :(得分: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))