10

我一直在使用 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),但错误仍然相同。我停止提高限制,因为在打开 html 文件时,BeautifulSoup 出现了问题。

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

有没有人有任何其他方法来使用 BeautifulSoup 进行多处理或如何克服这些错误?

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

编辑

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

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

4

1 回答 1

3

我认为原因是整个对象的返回soup.title。看来,所有的childrenandparent元素以及它们的子元素和父元素等等都在这一刻被分析了,这就引发了递归错误。

如果对象的内容是您所需要的,您可以简单地调用str方法:

return soup.title.__str__()

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

于 2012-11-01T20:18:44.093 回答