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 库的使用

Python爬虫(十四)_BeautifulSoup4 解析器

如何解决'连接中止'。使用BeautifulSoup在Python中出错

python中的beautifulsoup和xpath有啥异同点

python内存管理

Python 垃圾回收机制