私は次のような単純なコードを持っています:
p = soup.find_all("p")
paragraphs = []
for x in p:
paragraphs.append(str(x))
Xmlから取得したリストを変換して文字列に変換しようとしています。一部のテキストを再利用できるように、元のタグを付けたままにしておきたいので、このように追加する理由です。ただし、リストには6000を超える観測値が含まれているため、str:が原因で再帰エラーが発生します。
"RuntimeError:Pythonオブジェクトの呼び出し中に最大再帰深度を超えました"
最大再帰を変更できると読みましたが、変更するのは賢明ではありません。私の次のアイデアは、文字列への変換を500のバッチに分割することでしたが、これを行うにはもっと良い方法が必要だと確信しています。誰かアドバイスはありますか?
ここでの問題は、おそらく ドキュメント の下部にあるバイナリグラフィックデータの一部に、BeautifulSoupが実際のHTMLタグに修復しようとしている文字シーケンス<P
が含まれていることです。どのテキストが「再帰の深さを超えました」エラーを引き起こしているのか特定できませんでしたが、どこかにあります。私にとってはp[6053]
ですが、ファイルを少し変更したようです(または、Beautiful Soupに別のパーサーを使用している可能性があります)ので、あなたにとっては異なると思います。
actual<p>
タグから必要なものを抽出するために、ドキュメントの下部にあるバイナリデータが必要ないと仮定して、これを試してください:
# boot out the last `<document>`, which contains the binary data
soup.find_all('document')[-1].extract()
p = soup.find_all('p')
paragraphs = []
for x in p:
paragraphs.append(str(x))
問題は、BeautifulsSoup
オブジェクトp
がビルドされていないことだと思います iteratiely 、したがって メソッド呼び出し制限 に達してから終了しますp = soup.find_all('p')
を構築します。 soup.prettify()
をビルドするときにも同様にRecursionError
がスローされることに注意してください。
私のソリューションでは、re
モジュールを使用してすべての_<p>...</p>
_タグを収集しました(以下のコードを参照)。私の最終結果はlen(p) = 5571
でした。正規表現条件がバイナリグラフィックデータ内のどのテキストとも一致しなかったため、このカウントはあなたのカウントよりも少なくなっています。
_import re
import urllib
from urllib.request import Request, urlopen
url = 'https://www.sec.gov/Archives/edgar/data/1547063/000119312513465948/0001193125-13-465948.txt'
response = urllib.request.urlopen(url).read()
p = re.findall('<P((.|\s)+?)</P>', str(response)) #(pattern, string)
paragraphs = []
for x in p:
paragraphs.append(str(x))
_