使用beauthoulsoup将大型xml文件拆分为多个文件

2024-04-25 22:05:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将大的xml文件拆分为较小的xml文件,首先我从BeautifulGroup开始:

from bs4 import BeautifulSoup
import os
# Core settings
rootdir = r'C:\Users\XX\Documents\Grant Data\2010_xml'
extension = ".xml"
to_save = r'C:\Users\XX\Documents\all_patents_as_xml'

index = 0
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(extension):
            print(file)
            file_name = os.path.join(root,file)
            with open(file_name) as f:
                data = f.read()
            texts = data.split('?xml version="1.0" encoding="UTF-8"?')
            for text in texts:
                index += 1
                filename = to_save + "\\"+ str(index) + ".txt"
                with open(filename, 'w') as f:
                    f.write(text)

但是,我有一个记忆错误。然后我切换到xml etree:

^{pr2}$

我得到以下错误:

OverflowError: size does not fit in an int

我用的是windows操作系统,我知道在Linux下你可以把xml从consure中分离出来,但在我的例子中,我不知道该怎么做。在


Tags: 文件toinimportforindexosas
2条回答

你的问题和你试图解决的问题中有一些主要问题:

  1. 你提到用靓汤。然而,当您在代码中导入漂亮的Soup时,实际上并不需要对其进行任何操作。

  2. 您展示的使用xml.etree的代码严重错误。在parser = ET.iterparse(tree)行,tree是已经用ET.fromstring解析的XML树,但是iterparse的参数必须是文件名文件对象。XML树不是这两者。所以这种企图一到就死定了。

但更重要的是,看起来您要处理的是一个包含一堆连接的XML文件的文件。在您的xml.etree尝试中,您将进行以下测试:

element.tag == '?xml version="1.0" encoding="UTF-8"?'

对于这个测试,我可以想象的唯一意图是您认为xml.etree将以某种方式将<?xml version="1.0" encoding="UTF-8"?>解释为一个名为'?xml version="1.0" encoding="UTF-8"?'的XML元素。但是,结构<?xml version="1.0" encoding="UTF-8"?>不是一个XML元素,而是一个XML声明。在

而且,由于每次遇到XML声明时,您的代码似乎都在尝试拆分,您的输入似乎是一个包含多个XML声明的文件。此文件不是有效的XML。XML规范允许XML声明在XML文件的开头出现一次,,并且只出现一次。(不要将XML声明与处理指令混淆。它们看起来很相似,因为它们都由<??>分隔,但XML声明不是处理指令。)如果在输入文件上使用XML解析器,并且该解析器符合XML规范,然后,它必须以不是XML的形式拒绝您的文件,因为XML不允许XML声明出现在文档中的任意位置。在

那会给你留下什么?如果源文档中的所有XML声明都相同,那么有一种相对简单的方法可以让XML解析器解析文档。(您所做的尝试表明它们都是相同的,因为您不使用正则表达式来匹配不同形式的XML声明(例如,将指定standalone参数的表达式)。)您只需从源文档中删除所有XML声明,并将其包装在新的根元素中,并用xml.etree解析它。(这假设连接起来组成源文档的各个XML文档都是单独的格式良好的。如果他们不这样做,这就行不通了。)

但是,请注意,字符串<?xml version="1.0" encoding="UTF-8"?>可以出现在XML文档中,而这个字符串实际上不是XML声明。下面是一个格式良好的XML文档,它将放弃一种只查找类似XML声明的字符串的算法:

^{pr2}$

如果您知道源文件是如何创建的,那么您可能已经能够确定您没有上述任何情况。否则,您可能需要检查您的源代码,以确保不会发生上述情况。在

一旦您处理好了这一点,那么使用基于ET.iterparse的策略或SAX就可以了。在

如果由于内存限制而无法加载XML,则应考虑使用SAX。在

使用SAX,您将读取文档的“小部分”,做您想做的任何事情(例如:将每N个元素保存到一个新文件中)。在

Python SAXexample 1。在

Python SAXexample 2。在

相关问题 更多 >