2015-08-08 3 views
1

Я пытаюсь использовать многопроцессорных вместе с BeautifulSoup, но я встретив maximum recursion depth exceeded ошибку:Multiprocessing 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' («многопроцессорная» вилка с лучшей сериализацией). Не уверен, что он работает для объектов 'bs4'. –

ответ

2

В комментариях было указано, что можно просто отличить card как unicode. Однако это привело к ошибке process_card с slice indices must be integers or None or have an __index__ method. Оказывается, эта ошибка связана с тем фактом, что card больше не является объектом bs4 и поэтому не имеет доступа к функциям bs4. Вместо этого card является просто юникодом, а ошибка является ошибкой, связанной с юникодом. И поэтому сначала нужно превратить 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() 
Смежные вопросы