Python 漂亮的汤不能处理大文件

Python 漂亮的汤不能处理大文件,python,beautifulsoup,Python,Beautifulsoup,我有一个巨大的XML文件(1.2G),其中包含数百万音乐迷的信息,每个人都有一个简单的格式,如下所示 <MusicAlbum> <MusicType>P</MusicType> <Title>22 Exitos de Oro [Brentwood]</Title> <Performer>Chayito Valdéz</Performer> </MusicA

我有一个巨大的XML文件(1.2G),其中包含数百万音乐迷的信息,每个人都有一个简单的格式,如下所示

    <MusicAlbum>
      <MusicType>P</MusicType>
      <Title>22 Exitos de Oro [Brentwood]</Title>
      <Performer>Chayito Valdéz</Performer>
    </MusicAlbum>
...
    <MusicAlbum>
      <MusicType>A</MusicType>
      <Title>Bye Bye</Title>
      <Performer>Emma Aster</Performer>
    </MusicAlbum>
我明白了

Converting to Soup
Killed
显然,被杀是一件很美的事情。乌苏印刷品。

一种解决方案是将html分解为块,每个块都包含信息“MusicAlbum”和“/MusicAlbum”块,然后将它们传递给Beautifulsoup,但只是想确定是否有更简单的解决方案。

检查这是否适用于您,它不会很快,但不会占用超出您需要的内存:

# encoding:utf-8
import re

data = """    <MusicAlbum>
      <MusicType>P</MusicType>
      <Title>22 Exitos de Oro [Brentwood]</Title>
      <Performer>Chayito Valdéz</Performer>
    </MusicAlbum>
...
    <MusicAlbum>
      <MusicType>A</MusicType>
      <Title>Bye Bye</Title>
      <Performer>Emma Aster</Performer>
    </MusicAlbum>"""

MA = re.compile(r'<MusicAlbum>(.*?)</MusicAlbum>', re.DOTALL)
TY = re.compile(r'<MusicType>(.*)</MusicType>')
TI = re.compile(r'<Title>(.*)</Title>')
P = re.compile(r'<Performer>(.*)</Performer>')

albums = []
for album in re.findall(MA, data):
    albums.append({
        'type': re.search(TY, album).group(),
        'title': re.search(TI, album).group(),
        'performer': re.search(P, album).group()})


print albums
编码:utf-8 进口稀土 data=”“” P 22奥罗出口[布伦特伍德] 查伊托·瓦尔德斯 ... A. 再见 艾玛·阿斯特 """ MA=re.compile(r'(.*?),re.DOTALL) TY=重新编译(r'(.*)) TI=重新编译(r'(.*)) P=重新编译(r'(.*)) 相册=[] 对于有关findall的相册(MA,数据): 相册。附加({ “类型”:重新搜索(TY,album.group(), “标题”:重新搜索(TI,album.group(), “执行者”:重新搜索(P,album.group()) 印刷相册
BeautifulSoup在内存不足时引发MemoryError。这应该是因为其他原因,对吧?有这么多MusicAlbum对象,所以这是一个内存问题。你说的其他原因是什么?我会写一篇python的快速文章,将这一大块HTML拆分成单独的记录。我假设您真的希望将其导入数据库,以便一次处理一部分数据。为什么不使用xml解析器而不是beautifulsoup?事实上,因为我以前在python中处理过大量(200Mb)xml文件,所以如果您没有超级计算机,我会说使用任何真正的xml解析器(据我所知)是不现实的。我通过使用正则表达式编写精简的xml解析器来解决我的问题。当我把我的文件精简到50Mbi时,仍然需要大约10-15分钟,如果TY、TI或P中的任何一个可以跨越多行,那么添加“re.DOTALL”。。。
# encoding:utf-8
import re

data = """    <MusicAlbum>
      <MusicType>P</MusicType>
      <Title>22 Exitos de Oro [Brentwood]</Title>
      <Performer>Chayito Valdéz</Performer>
    </MusicAlbum>
...
    <MusicAlbum>
      <MusicType>A</MusicType>
      <Title>Bye Bye</Title>
      <Performer>Emma Aster</Performer>
    </MusicAlbum>"""

MA = re.compile(r'<MusicAlbum>(.*?)</MusicAlbum>', re.DOTALL)
TY = re.compile(r'<MusicType>(.*)</MusicType>')
TI = re.compile(r'<Title>(.*)</Title>')
P = re.compile(r'<Performer>(.*)</Performer>')

albums = []
for album in re.findall(MA, data):
    albums.append({
        'type': re.search(TY, album).group(),
        'title': re.search(TI, album).group(),
        'performer': re.search(P, album).group()})


print albums