2015-08-08 65 views
1

我试图使用与BeautifulSoup多处理一起,但我遇到一个maximum recursion depth exceeded错误:多重BeautifulSoup bs4.element.Tag

def process_card(card): 
    result = card.find("p") 
    # Do some more parsing with beautifulsoup 

    return results 


pool = multiprocessing.Pool(processes=4) 
soup = BeautifulSoup(url, 'html.parser') 
cards = soup.findAll("li") 
for card in cards: 
    result = pool.apply_async(process_card, [card]) 
    article = result.get() 
    if article is not None: 
     print article 
     articles.append(article) 
pool.close() 
pool.join() 

据我所知,card<class bs4.element.Tag>型的,问题可能有与酸洗这个对象有关。目前尚不清楚如何修改我的代码来解决这个问题。

+1

[最大递归错误Python]的可能重复(http://stackoverflow.com/questions/19529708/maximum-recursion-error-python)答案在这里相关。此外,如果你因为某些原因照做中的链接,另一种选择是使用一个更好的序列化,像(我的代码)'dill'这是在'multiprocess'(一个'multiprocessing'叉使用更好的系列化)。不知道它是否适用于'bs4'对象。 –

回答

2

它是在一个可以简单地投card为Unicode评论中指出。然而,这导致process_card功能与slice indices must be integers or None or have an __index__ method示数出来。事实证明,这种错误与事实,card不再是BS4对象,因此必须BS4功能用不上做。相反,card简直是Unicode和错误是一个Unicode相关的错误。所以人们需要把card而为汤,然后再从那里继续。这工作!

def process_card(unicode_card): 
    card = BeautifulSoup(unicode_card) 
    result = card.find("p") 
    # Do some more parsing with beautifulsoup 

    return results 


pool = multiprocessing.Pool(processes=4) 
soup = BeautifulSoup(url, 'html.parser') 
cards = soup.findAll("li") 
for card in cards: 
    result = pool.apply_async(process_card, [unicode(card)]) 
    article = result.get() 
    if article is not None: 
     print article 
     articles.append(article) 
pool.close() 
pool.join()