我遇到了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#的内置库运行相同的测试不会显示这种类型的行为。
是否要保持数据不变?您可以将原始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>'