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

2024-04-25 17:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的代码,比如:

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

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

我正在尝试转换一个从xml获得的列表并将其转换为字符串。我想保留它的原始标记,这样我可以重用一些文本,所以我要这样附加它的原因。但是,该列表包含6000多个观察结果,因此由于str:

“运行时错误:调用Python对象时超过了最大递归深度”

我听说你可以改变max递归,但这样做是不明智的。我的下一个想法是将字符串的转换分成500批,但我确信必须有更好的方法来实现这一点。有人有什么建议吗?


Tags: 字符串代码in标记文本列表for原因
2条回答

这里的问题可能是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))

我认为问题在于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))

相关问题 更多 >

    热门问题