【问题标题】:Writing modified Beautiful Soup tree to file, while maintaining original XML formatting将修改后的 Beautiful Soup 树写入文件,同时保持原始 XML 格式
【发布时间】:2012-10-08 01:40:22
【问题描述】:

我们有一个 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】:

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

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

这不是很好,但它解决了问题。但是,我不介意压痕,所以我真的不能说。我只会在需要打印时使用pprint.pprint()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 2023-03-09
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2011-08-05
    相关资源
    最近更新 更多