使用“&”时xml元素文本中的Python空间

时间:2018-03-15 01:25:03

标签: python-2.7 lxml

我有一个脚本,可以在线托管XML并在本地保存。然后,脚本将遍历本地文件并替换/添加某些文本。但是,出于某种原因,当我使用“&”时符号,在元素文本中有一个额外的空格。以下是我正在解析的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>

但是,在运行我的脚本以将附加测试添加到我的元素之后,文本会添加一个额外的空格,如下所示:

<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>

我已尝试过所有内容,但我不知道为什么会发生这种情况,或者我可以采取哪些措施来防止添加此空间。我甚至试图剥离白色空间。当我在上传之前查看本地保存的XML时,一切看起来都很好(&amp;是“&amp;”符号),如下所示:

<Tracking event="rewind">
http://www.example.com/rewind_1.png?test=rewind_test
&amp;cb={CACHEBUSTER}</Tracking>
                        <Tracking event="pause">
http://www.example.com/pause_1.png?test=rewind_test
&amp;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)

我绝对可以使用这方面的帮助。感谢。

更新:实际上,这似乎与使用“&amp;”无关。以下是我添加不同文本时的示例:

<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>

1 个答案:

答案 0 :(得分:1)

即使在向element.text添加任何内容之前,空格也在原始XML中;它是 .text 中的最后一个字母与结束标记之间的换行符。因此,您应该在添加文本之前删除空格,而不是像上面的代码中那样添加后删除空白:

....
if "?" in element.text:
    element.text = element.text.strip() + "&cb={CACHEBUSTER}"
else:
    element.text = element.text.strip() + "?cb={CACHEBUSTER}"
....