将修改后的Beautiful Soup树写入文件,同时保持原始XML格式

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

我们有一个XML文档,其中包含我们希望更改的标记:

...<version>1.0</version>...

它深埋在XML文件中,但我们已经成功地使用Beautiful Soup用命令行参数替换它的内容。

问题是在修改树之后,我们需要回写我们从中读取的文件。但是,我们希望保持文档的原始格式。我用的时候:

fileForWriting = open(myXmlFile, 'w')
fileForWriting.write(soup.prettify())

prettify()调用打破了格式化,我最终得到:

<version>
 1.0
</version>

有没有办法维护XML文档的原始格式,同时替换单个标记文本?

注意:使用简单:

fileForWriting.write(str(soup))

保持文本和标签在同一条线上,但消除了为了可读性而添加了人为的缩进和额外换行符。关闭,但没有雪茄。

根据要求,整个脚本:

from BeautifulSoup import BeautifulSoup as bs

import sys

xmlFile = sys.argv[1:][0]
version = sys.argv[1:][1]

fileForReading = open(xmlFile, 'r')
xmlString = fileForReading.read()
fileForReading.close()

soup = bs(xmlString)

soup.findAll('version')[1].contents[0].replaceWith(version)

fileForWriting = open(xmlFile, 'w')
fileForWriting.write(str(soup))
fileForWriting.close()

然后使用以下命令运行脚本:

python myscript.py someFile.xml 1.2

python xml xml-parsing beautifulsoup
1个回答
2
投票

如果使用xml.elementtreetree.write(file)方法仅用LF替换CRLF,这在尝试将XML文件导入到PyXB时也会产生问题。

我找到的解决方案是使用ElementTree来找到我要替换的内容。然后我做source_XML = 'new value'.join(source_XML.split('what you need to replace))最后一个file.write(source_XML)

这不好,但它解决了这个问题。但是,我不介意缩进,所以对此我不能说。每当我需要打印时,我只会使用pprint.pprint()

© www.soinside.com 2019 - 2024. All rights reserved.