如何修改列表中的对象并将其返回到新列表中

2024-04-24 15:17:05 发布

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

所以我想给那些漂亮的汤标签加上一个标签。 但是,使用此代码时,只有列表的最后一个标记将保留添加的标记。以前的标签将在迭代期间拥有它,然后将丢失它。变化不是持久的。你知道吗

import bs4


def add_tag(souplist, p):
    newlist = []
    for div in souplist:
        div.append(p)  # beautiful soup append
        newlist.append(div)  # list append
    return newlist

输入

soup1 = bs4.BeautifulSoup('<html><body><div>a</div></body></html>').find('div')
soup2 = bs4.BeautifulSoup('<html><body><div>b</div></body></html>').find('div')
soup3 = bs4.BeautifulSoup('<html><body><div>c</div></body></html>').find('div')

souplist = [soup1, soup2, soup3]
p = bs4.BeautifulSoup('<p>foo</p>').find('p')

refinedlist = add_tag(souplist, p)

输出

我希望refinedlist有以下输出:

>>> [<div>a<p>foo</p></div>, <div>b<p>foo</p></div>, <div>c<p>foo</p></div>]

但我得到了这个

>>> [<div>a</div>, <div>b</div>, <div>c<p>foo</p></div>]

注:如果有

 newlist.append(deepcopy(div))  # list append

它可以工作,但对于足够大的对象,它会触发“超过最大递归限制…”异常,可以通过将此类参数设置为更高的值来避免。但是,当您看到自己修改sys参数并使用deepcopy只是为了完成一个简单的操作时,我猜可能是做错了什么。你知道吗

那么,您通常如何获取对象列表、修改它们并返回一个包含修改对象的列表呢?对于这种共同的任务,必须有一种更简单的方法


Tags: 对象标记divadd列表foohtmlbody
1条回答
网友
1楼 · 发布于 2024-04-24 15:17:05
final = []
souplist = [soup1, soup2, soup3]
for s in souplist:
   p = bs4.BeautifulSoup('<p>foo</p>').find('p')
   s.append(p)
   final.append(s)
print(final)
[<div>a<p>foo</p></div>, <div>b<p>foo</p></div>, <div>c<p>foo</p></div>]

您需要为每个append创建一个新的p = bs4.BeautifulSoup('<p>foo</p>').find('p')对象

def add_tag(souplist, p):
    newlist = []
    for div in souplist:
        p = bs4.BeautifulSoup('<p>foo</p>').find('p')
        div.append(p)  # beautiful soup append
        newlist.append(div)  # list append
    return newlist

相关问题 更多 >