10

私はhtmlファイルを解析するためにBeautifulSoupを使用していますが、私が書いたすべてのスクリプトはうまく機能しますが遅いです。そのため、プログラムをより高速に実行できるように、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 で multiprocessing を使用すると、実行時間が短縮されますが、それを適用してファイルを開く方法がわかりません。

マルチプロセッシングで BeautifulSoup を使用する方法、またはこれらの種類のエラーを克服する方法について、他のアプローチを持っている人はいますか?

あらゆる種類の助けをいただければ幸いです。私はそれを修正しようとして何時間も座っており、エラーが発生する理由を理解しています。

編集

パスで指定したファイルを使用して上記のコードをテストしたところ、上記と同じ RuntimeError が発生しました

ファイルはここからアクセスできます ( http://ec2-23-20-166-224.compute-1.amazonaws.com/sites/html_files/ )

4

1 に答える 1

3

その理由は、オブジェクト全体が返されるためだと思いますsoup.title。この瞬間にすべてのchildren要素とその子や親などが分析されているようで、再帰エラーが発生します。parent

オブジェクトのコンテンツが必要なものである場合は、strメソッドを呼び出すだけです。

return soup.title.__str__()

残念ながら、これは、bs4-libraryによって提供される他のすべての情報にアクセスできなくなったことを意味します。

于 2012-11-01T20:18:44.093 に答える