Python space 在 xml 元素文本中使用“&”
Python space in xml element text when using "&"
我有一个脚本可以提取 XML 在线托管并保存在本地。然后脚本遍历本地文件和 replaces/adds 某些文本。但是,出于某种原因,当我使用“&”符号时,在元素文本中插入了一个额外的 space。这是我正在解析的 XML 元素的示例:
<TrackingEvents>
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test
</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test
</Tracking>
但是,在 运行 我的脚本向我的元素添加额外测试之后,文本添加了额外的 space,如下所示:
<TrackingEvents>
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test &cb={CACHEBUSTER}
</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test &cb={CACHEBUSTER}
</Tracking>
我已经尝试了所有方法,但我不知道为什么会发生这种情况,也不知道我可以做些什么来防止添加此 space。我什至也尝试去除白色 space。当我查看在上传之前保存在本地的 XML 时,一切看起来都很好(& 代表“&”符号),如源代码所示:
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test
&cb={CACHEBUSTER}</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test
&cb={CACHEBUSTER}</Tracking>
这是我脚本中的代码:
for URL, xml_name, original_server in tqdm(XML_tags):
response = requests.get(URL)
with open(xml_name, 'wb') as file:
file.write(response.content)
with open(xml_name) as saved_file:
tree = ET.parse(saved_file)
root = tree.getroot()
for element in root.iter(tag=ET.Element):
if element.text != None:
if ".png" in element.text:
if "?" in element.text:
element.text = element.text + "&cb={CACHEBUSTER}"
element.text = element.text.strip()
else:
element.text = element.text + "?cb={CACHEBUSTER}"
element.text = element.text.strip()
else:
pass
server = "example.server: ../sample/sample/" + original_server
tree.write(xml_name, xml_declaration=True, method='xml',
encoding='utf8')
server_upload = subprocess.Popen(["scp", xml_name, server])
upload_wait = os.waitpid(server_upload.pid, 0)
我绝对需要一些帮助。谢谢。
更新:实际上,这似乎与使用“&”无关。这是我添加不同文本时的示例:
<TrackingEvents>
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test test123
</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test test123
</Tracking>
</TrackingEvents>
甚至在您向 element.text
添加任何内容之前,空格就在原始 XML 中;它是 .text
中 最后一个字母和 结束标记 之间的换行符。因此,您应该在附加文本之前删除空格,而不是像在上面的代码中那样在附加文本之后删除空格:
....
if "?" in element.text:
element.text = element.text.strip() + "&cb={CACHEBUSTER}"
else:
element.text = element.text.strip() + "?cb={CACHEBUSTER}"
....
我有一个脚本可以提取 XML 在线托管并保存在本地。然后脚本遍历本地文件和 replaces/adds 某些文本。但是,出于某种原因,当我使用“&”符号时,在元素文本中插入了一个额外的 space。这是我正在解析的 XML 元素的示例:
<TrackingEvents>
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test
</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test
</Tracking>
但是,在 运行 我的脚本向我的元素添加额外测试之后,文本添加了额外的 space,如下所示:
<TrackingEvents>
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test &cb={CACHEBUSTER}
</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test &cb={CACHEBUSTER}
</Tracking>
我已经尝试了所有方法,但我不知道为什么会发生这种情况,也不知道我可以做些什么来防止添加此 space。我什至也尝试去除白色 space。当我查看在上传之前保存在本地的 XML 时,一切看起来都很好(& 代表“&”符号),如源代码所示:
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test
&cb={CACHEBUSTER}</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test
&cb={CACHEBUSTER}</Tracking>
这是我脚本中的代码:
for URL, xml_name, original_server in tqdm(XML_tags):
response = requests.get(URL)
with open(xml_name, 'wb') as file:
file.write(response.content)
with open(xml_name) as saved_file:
tree = ET.parse(saved_file)
root = tree.getroot()
for element in root.iter(tag=ET.Element):
if element.text != None:
if ".png" in element.text:
if "?" in element.text:
element.text = element.text + "&cb={CACHEBUSTER}"
element.text = element.text.strip()
else:
element.text = element.text + "?cb={CACHEBUSTER}"
element.text = element.text.strip()
else:
pass
server = "example.server: ../sample/sample/" + original_server
tree.write(xml_name, xml_declaration=True, method='xml',
encoding='utf8')
server_upload = subprocess.Popen(["scp", xml_name, server])
upload_wait = os.waitpid(server_upload.pid, 0)
我绝对需要一些帮助。谢谢。
更新:实际上,这似乎与使用“&”无关。这是我添加不同文本时的示例:
<TrackingEvents>
<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test test123
</Tracking>
<Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test test123
</Tracking>
</TrackingEvents>
甚至在您向 element.text
添加任何内容之前,空格就在原始 XML 中;它是 .text
中 最后一个字母和 结束标记 之间的换行符。因此,您应该在附加文本之前删除空格,而不是像在上面的代码中那样在附加文本之后删除空格:
....
if "?" in element.text:
element.text = element.text.strip() + "&cb={CACHEBUSTER}"
else:
element.text = element.text.strip() + "?cb={CACHEBUSTER}"
....