【问题标题】:Multiprocessing BeautifulSoup bs4.element.Tag多处理 BeautifulSoup bs4.element.Tag
【发布时间】:2015-10-31 13:15:49
【问题描述】:

我正在尝试将多处理与 BeautifulSoup 一起使用,但遇到 maximum recursion depth exceeded 错误:

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>,问题可能与腌制此对象有关。目前尚不清楚我必须如何修改我的代码来解决这个问题。

【问题讨论】:

  • maximum recursion error Python 的可能重复答案在这里是相关的。此外,如果由于某种原因您不能遵循链接中的建议,另一种选择是使用更好的序列化程序,例如(我的代码)dill,它用于multiprocess(具有更好序列化的multiprocessing fork )。不确定它是否适用于 bs4 对象。

标签: python-2.7 beautifulsoup pickle python-multiprocessing


【解决方案1】:

在 cmets 中指出,可以简单地将 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多