使用BeautifulSoup

时间:2015-05-15 19:57:53

标签: python xml beautifulsoup enthought

我正在尝试阅读一堆xml文件并对其进行处理。我想要做的第一件事是根据文件中的数字重命名它们。

您可以看到数据样本here 警告这将开始下载108MB的zip文件!。这是一个巨大的xml文件,里面有成千上万个较小的xml文件。我已将它们分解为单个文件。我想根据内部的数字重命名文件(预处理的一部分)。我有以下代码:

from __future__ import print_function
from bs4 import BeautifulSoup # To get everything
import os

def rename_xml_files(directory):
    xml_files = [xml_file for xml_file in os.listdir(directory) ]

    for filename in xml_files:
        filename = filename.strip()
        full_filename = directory + "/" +filename
        print (full_filename)
        f = open(full_filename, "r")
        xml = f.read()
        soup = BeautifulSoup(xml)
        del xml
        del soup
        f.close()

如果我注释掉“汤=”和“del”系列,那就完美了。如果我添加“汤= ...”行,它将工作片刻,然后它最终会废弃 - 它只是崩溃了python内核。我正在使用Enthought Canopy,但我已经尝试从命令行运行它并且也在那里疯狂。

我想,也许,它没有为变量“汤”释放空间,所以我尝试添加“del”命令。同样的问题。

有关如何规避此事的任何想法?我不是坚持BS。如果有更好的方法,我会喜欢它,但我需要一些示例代码。

2 个答案:

答案 0 :(得分:2)

尝试使用Python标准{{1}}库中的{{1}}而不是BeautifulSoup。 '汤非常适合解析普通网页,但是cElementTree非常快。

像这样:

{{1}}

如果您的XML格式正确,则应解析它。如果您的机器仍然无法处理内存中的所有数据,您应该查看streaming XML。

答案 1 :(得分:0)

我不会将该文件分成许多小文件,然后再处理它们,我会一次性处理它们。

我只需使用streaming api XML解析器并解析主文件,获取名称并使用正确的名称写出子文件一次。

不需要BeautifulSoup,它主要用于处理HTML并使用文档模型而不是流解析器。

为了一次性获取单个元素,您无需构建整个DOM。