我有一个简单的代码:
p = soup.find_all("p")
paragraphs = []
for x in p:
paragraphs.append(str(x))
我正在尝试转换从xml获取的列表并将其转换为字符串。我想保留它的原始标签,以便我可以重用一些文本,因此我之所以如此追加它。但是该列表包含超过6000个观察值,因此由于str:
而发生递归错误“RuntimeError:调用Python对象时超出了最大递归深度”
我读到你可以改变最大递归但这样做并不明智。我的下一个想法是将转换分为500个批次,但我相信必须有更好的方法来做到这一点。有没有人有任何建议?
答案 0 :(得分:6)
这里的问题可能是the document底部的一些二进制图形数据包含字符序列<P
,Beautiful Soup正试图将其修复为实际的HTML标记。我没有设法确定哪个文本导致“超出递归深度”错误,但它在那里的某个地方。它对我来说是p[6053]
,但是因为你似乎已经修改了一些文件(或者你可能正在使用不同的解析器来处理美丽的汤),所以对我来说它会有所不同,我想。
假设您不需要文档底部的二进制数据从实际 <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))
答案 1 :(得分:0)
我认为问题在于BeautifulsSoup
对象p
未构建iteratiely,因此在您完成构建p = soup.find_all('p')
之前已达到method call limit。请注意,构建RecursionError
时,soup.prettify()
同样会被抛出。
对于我的解决方案,我使用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))