如何将bs4.element.ResultSet转换为字符串?蟒蛇

时间:2014-01-07 09:54:37

标签: python beautifulsoup runtime-error

我有一个简单的代码:

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

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

我正在尝试转换从xml获取的列表并将其转换为字符串。我想保留它的原始标签,以便我可以重用一些文本,因此我之所以如此追加它。但是该列表包含超过6000个观察值,因此由于str:

而发生递归错误

“RuntimeError:调用Python对象时超出了最大递归深度”

我读到你可以改变最大递归但这样做并不明智。我的下一个想法是将转换分为500个批次,但我相信必须有更好的方法来做到这一点。有没有人有任何建议?

2 个答案:

答案 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))