使用BeautifulSoup与多处理池映射时的递归深度错误

时间:2012-04-29 17:56:02

标签: python multiprocessing beautifulsoup

我一直在使用BeautifulSoup来解析html文件,而我编写的所有脚本都运行良好但速度很慢。所以我正在尝试使用多处理工作池和BeautifulSoup,这样我的程序可以更快地运行(我有100,000 - 1,000,000个html文件要打开)。我写的脚本比较复杂,但我在这里写下了一个小例子。我正在尝试做这样的事情,我不断收到错误

'RuntimeError:蚀刻对象时超出了最大递归深度

已编辑的代码

from bs4 import BeautifulSoup
from multiprocessing import Pool
def extraction(path):
   soup=BeautifulSoup(open(path),"lxml")
   return soup.title

pool=Pool(processes=4)
path=['/Volume3/2316/http/www.metro.co.uk/news/852300-haiti-quake-victim-footballers-stage-special-tournament/crawlerdefault.html','/Volume3/2316/http/presszoom.com/story_164020.html']
print pool.map(extraction,path)
pool.close()
pool.join()

在做了一些搜索并挖掘了一些帖子后,我知道错误正在发生,因为BeautifulSoup超出了python解释器堆栈的深度。我试图提高限制并运行相同的程序(我上升到3000)但错误仍然相同。我停止提高限制因为打开ht​​ml文件时问题出在BeautifulSoup上。

对BeautifulSoup使用多处理将加快我的执行时间,但我无法弄清楚如何应用它来打开文件。

有没有人有任何其他方法可以使用BeautifulSoup进行多处理或如何解决这些错误?

任何形式的帮助将不胜感激,我坐了几个小时试图解决它并理解我为什么会收到错误。

修改

我用我在路径中给出的文件测试了上面的代码,我得到了与上面相同的RuntimeError

可以在此处访问这些文件(http://ec2-23-20-166-224.compute-1.amazonaws.com/sites/html_files/

1 个答案:

答案 0 :(得分:3)

我认为原因是整个soup.title - 对象的返回。看来,此时所有childrenparent元素以及它们的子元素和父元素等都会被分析,这会引发递归错误。

如果对象的内容符合您的要求,您只需调用 str - 方法:

return soup.title.__str__()

不幸的是,这意味着您无法再访问bs4-library提供的所有其他信息。