BeautifulSoup的Python内存问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BeautifulSoup的Python内存问题相关的知识,希望对你有一定的参考价值。
我已经解决了这个问题,但我想知道为什么它首先造成的。我使用BeautifulSoup从网页中识别出这个范围:
span = <span id="ctl00_ContentPlaceHolder1_RestInfoReskin_lblRestName">Ally's Sizzlers</span>
然后我分配这个变量:
restaurant.name = span.contents
但是在每个循环中,这需要一个完整的1 MB,并且大约有20,000个循环。通过反复试验,我找到了这个解决方案:
restaurant.name = str(span.contents)
你能告诉我为什么前span.contents会占用这么多内存吗?
答案
可能是因为str(span.contents)
在对象__str__
中调用span.contents
函数并返回一个较小的表示。您可以使用pympler来测量内存消耗
另一答案
老东西,但以防其他人想知道:span.contents
返回对NavigableString
实例的引用。此实例与DOM树之间存在链接,因此只要此实例正在使用中,垃圾收集器就无法从内存中释放整个DOM树。因此,只要restaurant.name
没有从内存中释放,整个DOM树就会保存在内存中。
使用str(span.contents)
返回一个未与DOM树链接的字符串,因此它不会阻止DOM树从内存中释放。
以上是关于BeautifulSoup的Python内存问题的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫(十四)_BeautifulSoup4 解析器
如何解决'连接中止'。使用BeautifulSoup在Python中出错