web-dev-qa-db-ja.com

bs4.element.ResultSetを文字列に変換する方法は? Python

私は次のような単純なコードを持っています:

    p = soup.find_all("p")
    paragraphs = []

    for x in p:
        paragraphs.append(str(x))

Xmlから取得したリストを変換して文字列に変換しようとしています。一部のテキストを再利用できるように、元のタグを付けたままにしておきたいので、このように追加する理由です。ただし、リストには6000を超える観測値が含まれているため、str:が原因で再帰エラーが発生します。

"RuntimeError:Pythonオブジェクトの呼び出し中に最大再帰深度を超えました"

最大再帰を変更できると読みましたが、変更するのは賢明ではありません。私の次のアイデアは、文字列への変換を500のバッチに分割することでしたが、これを行うにはもっと良い方法が必要だと確信しています。誰かアドバイスはありますか?

8
samuraiexe

ここでの問題は、おそらく ドキュメント の下部にあるバイナリグラフィックデータの一部に、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))
6
senshin

問題は、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))
_
0
mattcan