Python 漂亮的汤不能处理大文件
我有一个巨大的XML文件(1.2G),其中包含数百万音乐迷的信息,每个人都有一个简单的格式,如下所示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
<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