如何从列表中修改对象并将它们返回到新列表中

时间:2014-08-27 15:51:43

标签: python list beautifulsoup deep-copy

所以我正在尝试为那些美丽的汤标签添加标签。 但是,使用此代码,列表的最后一个标记将保留添加的标记。以前的标签会在迭代期间使用它,然后会失去它。变化不是持久的。

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)

输出

我期待精制列表的输出:

>>> [<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只是为了完成一个简单的操作时,我想可能有些事情做错了。

那么你如何获得一个对象列表,修改它们,并返回一个包含修改过的对象的列表?这种共同任务必须有一种更简单的方法

1 个答案:

答案 0 :(得分:0)

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>]

您需要为每个附加内容创建一个新的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