我一直在使用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/)
答案 0 :(得分:3)
我认为原因是整个soup.title
- 对象的返回。看来,此时所有children
和parent
元素以及它们的子元素和父元素等都会被分析,这会引发递归错误。
如果对象的内容符合您的要求,您只需调用 str - 方法:
return soup.title.__str__()
不幸的是,这意味着您无法再访问bs4-library提供的所有其他信息。