ElementTree更改文本换行符?如何关闭此功能?

问题描述 投票:1回答:1

我遇到了ElemenetTree的问题,当它解析文件或字符串时,它被xml内的文本弄乱了。我们得到xml,其中行尾可能是windows \r\n或unix \n。我们正在处理文本并从中拉出偏移量。由于ET将实际文本弄乱了,这意味着无法将偏移量映射回原始文本。

运行此最小示例显示了问题。

>>> import xml.etree.ElementTree as ET
>>> xml = '<element>this is text\r\nwith windows newlines</element>'
>>> e = ET.fromstring(xml)
>>> xml
'<element>this is text\r\nwith windows newlines</element>'
>>> e.text
'this is text\nwith windows newlines'
>>> print(xml)
<element>this is text
with windows newlines</element>
>>> print(e.text)
this is text
with windows newlines

解析的文本将换行符从\r\n转换为\n

[最初,我认为“还不错,如果输入字符串包含\n,只需再次用\r\n替换所有\r,但是查看我们的数据,我们可以获得诸如\r\r\n\r\n\n等的组合。会从ET产生甚至更奇怪的结果:

>>> xml = '<element>multiple returns\r\r\nget lost</element>'
>>> e = ET.fromstring(xml)
>>> e.text
'multiple returns\n\nget lost'
>>> xml = '<element>multiple returns\r\n\nget lost</element>'
>>> e = ET.fromstring(xml)
>>> e.text
'multiple returns\n\nget lost'
>>> xml = '<element>lone\rreturns? what??</element>'
>>> e = ET.fromstring(xml)
>>> e.text
'lone\nreturns? what??'

我已经在2.7.15,python 3.7.3和pypy 2.5.0(python 2.7.8)(我目前在我的计算机上进行了测试)中进行了测试,并且所有3种都表现出相同的行为。我找不到其他人遇到此问题,但这种行为感觉不正确。使用Java和C#的内置库运行相同的测试不会显示这种类型的行为。

python-3.x python-3.7 elementtree
1个回答
0
投票

是否要保持数据不变?您可以将原始XML文件替换为ET生成的数据。您也可以尝试以下方法。

>>> from simplified_scrapy import SimplifiedDoc
>>> xml = '<element>multiple returns\r\nget lost</element>'
>>> doc = SimplifiedDoc(xml)
>>> doc.element.html
'multiple returns\r\nget lost'
>>> doc.html
'<element>multiple returns\r\nget lost</element>'
© www.soinside.com 2019 - 2024. All rights reserved.